Module Name:    src
Committed By:   bouyer
Date:           Sat Jun  6 22:04:40 UTC 2009

Modified Files:
        src/sbin/newfs_udf [netbsd-5]: udf_create.c
        src/sys/fs/udf [netbsd-5]: udf_allocation.c udf_bswap.h udf_subr.c

Log Message:
Pull up following revision(s) (requested by reinoud in ticket #770):
        sys/fs/udf/udf_subr.c: revision 1.88, 1.89
        sys/fs/udf/udf_bswap.h: revision 1.6, 1.7
        sys/fs/udf/udf_allocation.c: revision 1.22, 1.23
        sbin/newfs_udf/udf_create.c: revision 1.16
Fix *serious* bug in bswapping definitions for big endian machines.
ANSI-fy. No idea why they weren't so in the first place.
Fix newfs_udf to create a valid disc images on bigendian machines.
A descriptor's CRC lenth is 16 bit so use udf_rw16() on tag.desc_crc_len.
Forgot to use the udf_rw16() on the descriptor crc lengths of FID's!
Also fix a few dubiously formatted checks.
On creation of a new node, don't forget to set the length of the allocated
space in the right endian!
Account for the logical blocks recorded by the extent in the right endian!


To generate a diff of this commit:
cvs rdiff -u -r1.12.4.2 -r1.12.4.3 src/sbin/newfs_udf/udf_create.c
cvs rdiff -u -r1.18.4.2 -r1.18.4.3 src/sys/fs/udf/udf_allocation.c
cvs rdiff -u -r1.5 -r1.5.8.1 src/sys/fs/udf/udf_bswap.h
cvs rdiff -u -r1.73.4.10 -r1.73.4.11 src/sys/fs/udf/udf_subr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/newfs_udf/udf_create.c
diff -u src/sbin/newfs_udf/udf_create.c:1.12.4.2 src/sbin/newfs_udf/udf_create.c:1.12.4.3
--- src/sbin/newfs_udf/udf_create.c:1.12.4.2	Wed Feb 18 00:37:00 2009
+++ src/sbin/newfs_udf/udf_create.c	Sat Jun  6 22:04:40 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_create.c,v 1.12.4.2 2009/02/18 00:37:00 snj Exp $ */
+/* $NetBSD: udf_create.c,v 1.12.4.3 2009/06/06 22:04:40 bouyer Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: udf_create.c,v 1.12.4.2 2009/02/18 00:37:00 snj Exp $");
+__RCSID("$NetBSD: udf_create.c,v 1.12.4.3 2009/06/06 22:04:40 bouyer Exp $");
 #endif /* not lint */
 
 #include <stdio.h>
@@ -1055,7 +1055,7 @@
 	assert(lvid);
 	assert(logvol);
 
-	lvid->integrity_type = udf_rw16(type);
+	lvid->integrity_type = udf_rw32(type);
 
 	num_partmappings = udf_rw32(logvol->n_pm);
 
@@ -1298,7 +1298,7 @@
 	fid->file_char = UDF_FILE_CHAR_DIR | UDF_FILE_CHAR_PAR;
 	fid->icb = *parent;
 	fid->icb.longad_uniqueid = udf_rw32((uint32_t) unique_id);
-	fid->tag.desc_crc_len = fidsize - UDF_DESC_TAG_LENGTH;
+	fid->tag.desc_crc_len = udf_rw16(fidsize - UDF_DESC_TAG_LENGTH);
 
 	/* we have to do the fid here explicitly for simplicity */
 	udf_validate_tag_and_crc_sums((union dscrptr *) fid);

Index: src/sys/fs/udf/udf_allocation.c
diff -u src/sys/fs/udf/udf_allocation.c:1.18.4.2 src/sys/fs/udf/udf_allocation.c:1.18.4.3
--- src/sys/fs/udf/udf_allocation.c:1.18.4.2	Thu Apr 23 02:22:25 2009
+++ src/sys/fs/udf/udf_allocation.c	Sat Jun  6 22:04:40 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_allocation.c,v 1.18.4.2 2009/04/23 02:22:25 snj Exp $ */
+/* $NetBSD: udf_allocation.c,v 1.18.4.3 2009/06/06 22:04:40 bouyer Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.18.4.2 2009/04/23 02:22:25 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.18.4.3 2009/06/06 22:04:40 bouyer Exp $");
 #endif /* not lint */
 
 
@@ -1325,11 +1325,11 @@
 	if (fe) {
 		fe->l_ad         = udf_rw32(0);
 		fe->logblks_rec  = udf_rw64(0);
-		fe->tag.desc_crc_len = udf_rw32(crclen);
+		fe->tag.desc_crc_len = udf_rw16(crclen);
 	} else {
 		efe->l_ad        = udf_rw32(0);
 		efe->logblks_rec = udf_rw64(0);
-		efe->tag.desc_crc_len = udf_rw32(crclen);
+		efe->tag.desc_crc_len = udf_rw16(crclen);
 	}
 
 	/* wipe all allocation extent entries */
@@ -1342,7 +1342,7 @@
 		ext->l_ad = udf_rw32(0);
 
 		crclen = dscr_size - UDF_DESC_TAG_LENGTH;
-		ext->tag.desc_crc_len = udf_rw32(crclen);
+		ext->tag.desc_crc_len = udf_rw16(crclen);
 	}
 	udf_node->i_flags |= IN_NODE_REBUILD;
 }
@@ -1568,7 +1568,7 @@
 
 	/* offset is offset within the current (E)FE/AED */
 	l_ad   = udf_rw32(*l_ad_p);
-	crclen = udf_rw32(dscr->tag.desc_crc_len);
+	crclen = udf_rw16(dscr->tag.desc_crc_len);
 	logblks_rec = udf_rw64(*logblks_rec_p);
 
 	/* overwriting old piece? */
@@ -1630,7 +1630,7 @@
 			memset(ext->data, 0, max_l_ad);
 			ext->l_ad = udf_rw32(0);
 			ext->tag.desc_crc_len =
-				udf_rw32(dscr_size - UDF_DESC_TAG_LENGTH);
+				udf_rw16(dscr_size - UDF_DESC_TAG_LENGTH);
 
 			/* declare aed */
 			udf_node->num_extensions++;
@@ -1648,7 +1648,7 @@
 		}
 		l_ad   += adlen;
 		crclen += adlen;
-		dscr->tag.desc_crc_len = udf_rw32(crclen);
+		dscr->tag.desc_crc_len = udf_rw16(crclen);
 		*l_ad_p = udf_rw32(l_ad);
 
 		/* advance to the new extension */
@@ -1660,7 +1660,7 @@
 
 		l_ad_p = &ext->l_ad;
 		l_ad   = udf_rw32(*l_ad_p);
-		crclen = udf_rw32(dscr->tag.desc_crc_len);
+		crclen = udf_rw16(dscr->tag.desc_crc_len);
 		offset = 0;
 
 		/* adjust callees slot count for link insert */
@@ -1682,16 +1682,17 @@
 	}
 
 	/* adjust logblks recorded count */
-	flags = UDF_EXT_FLAGS(udf_rw32(icb->len));
+	len = udf_rw32(icb->len);
+	flags = UDF_EXT_FLAGS(len);
 	if (flags == UDF_EXT_ALLOCATED)
-		logblks_rec += (UDF_EXT_LEN(icb->len) + lb_size -1) / lb_size;
+		logblks_rec += (UDF_EXT_LEN(len) + lb_size -1) / lb_size;
 	*logblks_rec_p = udf_rw64(logblks_rec);
 
 	/* adjust l_ad and crclen when needed */
 	if (offset >= l_ad) {
 		l_ad   += adlen;
 		crclen += adlen;
-		dscr->tag.desc_crc_len = udf_rw32(crclen);
+		dscr->tag.desc_crc_len = udf_rw16(crclen);
 		*l_ad_p = udf_rw32(l_ad);
 	}
 
@@ -2201,12 +2202,12 @@
 			if (fe) {
 				fe->inf_len   = udf_rw64(inflen);
 				fe->l_ad      = udf_rw32(l_ad);
-				fe->tag.desc_crc_len = udf_rw32(crclen);
+				fe->tag.desc_crc_len = udf_rw16(crclen);
 			} else {
 				efe->inf_len  = udf_rw64(inflen);
 				efe->obj_size = udf_rw64(objsize);
 				efe->l_ad     = udf_rw32(l_ad);
-				efe->tag.desc_crc_len = udf_rw32(crclen);
+				efe->tag.desc_crc_len = udf_rw16(crclen);
 			}
 			error = 0;
 
@@ -2474,12 +2475,12 @@
 		if (fe) {
 			fe->inf_len   = udf_rw64(inflen);
 			fe->l_ad      = udf_rw32(l_ad);
-			fe->tag.desc_crc_len = udf_rw32(crclen);
+			fe->tag.desc_crc_len = udf_rw16(crclen);
 		} else {
 			efe->inf_len  = udf_rw64(inflen);
 			efe->obj_size = udf_rw64(objsize);
 			efe->l_ad     = udf_rw32(l_ad);
-			efe->tag.desc_crc_len = udf_rw32(crclen);
+			efe->tag.desc_crc_len = udf_rw16(crclen);
 		}
 		error = 0;
 
@@ -2635,12 +2636,12 @@
 			if (fe) {
 				fe->inf_len   = udf_rw64(inflen);
 				fe->l_ad      = udf_rw32(l_ad);
-				fe->tag.desc_crc_len = udf_rw32(crclen);
+				fe->tag.desc_crc_len = udf_rw16(crclen);
 			} else {
 				efe->inf_len  = udf_rw64(inflen);
 				efe->obj_size = udf_rw64(objsize);
 				efe->l_ad     = udf_rw32(l_ad);
-				efe->tag.desc_crc_len = udf_rw32(crclen);
+				efe->tag.desc_crc_len = udf_rw16(crclen);
 			}
 			/* eventually copy in evacuated piece */
 			/* set new size for uvm */

Index: src/sys/fs/udf/udf_bswap.h
diff -u src/sys/fs/udf/udf_bswap.h:1.5 src/sys/fs/udf/udf_bswap.h:1.5.8.1
--- src/sys/fs/udf/udf_bswap.h:1.5	Wed May 14 16:49:48 2008
+++ src/sys/fs/udf/udf_bswap.h	Sat Jun  6 22:04:40 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_bswap.h,v 1.5 2008/05/14 16:49:48 reinoud Exp $	*/
+/* $NetBSD: udf_bswap.h,v 1.5.8.1 2009/06/06 22:04:40 bouyer Exp $	*/
 
 /*
  * Copyright (c) 1998 Manuel Bouyer.
@@ -37,49 +37,35 @@
 #ifndef _FS_UDF_UDF_BSWAP_H_
 #define _FS_UDF_UDF_BSWAP_H_
 
-#if HAVE_ENDIAN_H
-#include <endian.h>
-#else
-#if HAVE_SYS_ENDIAN_H
 #include <sys/endian.h>
-#else
-#if HAVE_MACHINE_ENDIAN_H
-#include <machine/endian.h>
-#endif
-#endif
-#endif
+#include <machine/bswap.h>
+#include <sys/bswap.h>
 
 /* rest only relevant for big endian machines */
 #if (BYTE_ORDER == BIG_ENDIAN)
 
-#include <machine/bswap.h>
-#include <sys/bswap.h>
-
 /* inlines for access to swapped data */
-static __inline u_int16_t udf_rw16(u_int16_t);
-static __inline u_int32_t udf_rw32(u_int32_t);
-static __inline u_int64_t udf_rw64(u_int64_t);
+static __inline uint16_t udf_rw16(uint16_t);
+static __inline uint32_t udf_rw32(uint32_t);
+static __inline uint64_t udf_rw64(uint64_t);
 
 
-static __inline u_int16_t
-udf_rw16(a)
-	u_int16_t a;
+static __inline uint16_t
+udf_rw16(uint16_t a)
 {
 	return bswap16(a);
 }
 
 
-static __inline u_int32_t
-udf_rw32(a)
-	u_int32_t a;
+static __inline uint32_t
+udf_rw32(uint32_t a)
 {
 	return bswap32(a);
 }
 
 
-static __inline u_int64_t
-udf_rw64(a)
-	u_int64_t a;
+static __inline uint64_t
+udf_rw64(uint64_t a)
 {
 	return bswap64(a);
 }
@@ -94,3 +80,4 @@
 
 
 #endif /* !_FS_UDF_UDF_BSWAP_H_ */
+

Index: src/sys/fs/udf/udf_subr.c
diff -u src/sys/fs/udf/udf_subr.c:1.73.4.10 src/sys/fs/udf/udf_subr.c:1.73.4.11
--- src/sys/fs/udf/udf_subr.c:1.73.4.10	Mon Jun  1 17:11:35 2009
+++ src/sys/fs/udf/udf_subr.c	Sat Jun  6 22:04:40 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_subr.c,v 1.73.4.10 2009/06/01 17:11:35 liamjfoy Exp $ */
+/* $NetBSD: udf_subr.c,v 1.73.4.11 2009/06/06 22:04:40 bouyer Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.73.4.10 2009/06/01 17:11:35 liamjfoy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.73.4.11 2009/06/06 22:04:40 bouyer Exp $");
 #endif /* not lint */
 
 
@@ -2235,7 +2235,7 @@
 	fid->file_char = UDF_FILE_CHAR_DIR | UDF_FILE_CHAR_PAR;
 	fid->icb = *parent;
 	fid->icb.longad_uniqueid = udf_rw32((uint32_t) unique_id);
-	fid->tag.desc_crc_len = fidsize - UDF_DESC_TAG_LENGTH;
+	fid->tag.desc_crc_len = udf_rw16(fidsize - UDF_DESC_TAG_LENGTH);
 	(void) udf_validate_tag_and_crc_sums((union dscrptr *) fid);
 
 	return fidsize;
@@ -4919,11 +4919,11 @@
 
 		/* only reuse entries that are wiped */
 		/* check if the len + loc are marked zero */
-		if (udf_rw32(fid->icb.len != 0))
+		if (udf_rw32(fid->icb.len) != 0)
 			continue;
 		if (udf_rw32(fid->icb.loc.lb_num) != 0)
 			continue;
-		if (udf_rw16(fid->icb.loc.part_num != 0))
+		if (udf_rw16(fid->icb.loc.part_num) != 0)
 			continue;
 #endif	/* UDF_COMPLETE_DELETE */
 
@@ -4991,7 +4991,7 @@
 	unix_to_udf_name((char *) fid->data + udf_rw16(fid->l_iu),
 		&fid->l_fi, cnp->cn_nameptr, cnp->cn_namelen, &osta_charspec);
 
-	fid->tag.desc_crc_len = chosen_size - UDF_DESC_TAG_LENGTH;
+	fid->tag.desc_crc_len = udf_rw16(chosen_size - UDF_DESC_TAG_LENGTH);
 	(void) udf_validate_tag_and_crc_sums((union dscrptr *) fid);
 
 	/* writeout FID/update parent directory */
@@ -5600,7 +5600,7 @@
 
 	/* initialise pointer to location */
 	memset(&node_icb_loc, 0, sizeof(struct long_ad));
-	node_icb_loc.len = lb_size;
+	node_icb_loc.len = udf_rw32(lb_size);
 	node_icb_loc.loc.lb_num   = udf_rw32(lb_num);
 	node_icb_loc.loc.part_num = udf_rw16(vpart_num);
 

Reply via email to