Module Name:    src
Committed By:   martin
Date:           Sun Apr 24 16:39:00 UTC 2022

Modified Files:
        src/sys/compat/netbsd32 [netbsd-9]: netbsd32.h netbsd32_fs.c
        src/sys/fs/udf [netbsd-9]: udf_subr.c

Log Message:
Pull up following revision(s) (requested by reinoud in ticket #1438):

        sys/compat/netbsd32/netbsd32.h: revision 1.140
        sys/compat/netbsd32/netbsd32_fs.c: revision 1.95
        sys/fs/udf/udf_subr.c: revision 1.169

Fix endian issue with UDF extended attribute handling

Implement support for mounting UDF in compat32
Fixes PR#56801


To generate a diff of this commit:
cvs rdiff -u -r1.123.4.1 -r1.123.4.2 src/sys/compat/netbsd32/netbsd32.h
cvs rdiff -u -r1.82.4.1 -r1.82.4.2 src/sys/compat/netbsd32/netbsd32_fs.c
cvs rdiff -u -r1.146.2.2 -r1.146.2.3 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/sys/compat/netbsd32/netbsd32.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.123.4.1 src/sys/compat/netbsd32/netbsd32.h:1.123.4.2
--- src/sys/compat/netbsd32/netbsd32.h:1.123.4.1	Tue Nov 19 13:36:25 2019
+++ src/sys/compat/netbsd32/netbsd32.h	Sun Apr 24 16:39:00 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32.h,v 1.123.4.1 2019/11/19 13:36:25 martin Exp $	*/
+/*	$NetBSD: netbsd32.h,v 1.123.4.2 2022/04/24 16:39:00 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -1095,6 +1095,25 @@ struct netbsd32_msdosfs_args {
 	int	gmtoff;		/* v3: offset from UTC in seconds */
 };
 
+/* from <udf/udf_mount.h> */
+struct netbsd32_udf_args {
+	uint32_t	 version;	/* version of this structure         */
+	netbsd32_charp	 fspec;		/* mount specifier                   */
+	int32_t		 sessionnr;	/* session specifier, rel of abs     */
+	uint32_t	 udfmflags;	/* mount options                     */
+	int32_t		 gmtoff;	/* offset from UTC in seconds        */
+
+	uid_t		 anon_uid;	/* mapping of anonymous files uid    */
+	gid_t		 anon_gid;	/* mapping of anonymous files gid    */
+	uid_t		 nobody_uid;	/* nobody:nobody will map to -1:-1   */
+	gid_t		 nobody_gid;	/* nobody:nobody will map to -1:-1   */
+
+	uint32_t	 sector_size;	/* for mounting dumps/files          */
+
+	/* extendable */
+	uint8_t	 reserved[32];
+};
+
 /* from <miscfs/genfs/layer.h> */
 struct netbsd32_layer_args {
 	netbsd32_charp target;		/* Target of loopback  */

Index: src/sys/compat/netbsd32/netbsd32_fs.c
diff -u src/sys/compat/netbsd32/netbsd32_fs.c:1.82.4.1 src/sys/compat/netbsd32/netbsd32_fs.c:1.82.4.2
--- src/sys/compat/netbsd32/netbsd32_fs.c:1.82.4.1	Wed Oct 16 17:29:49 2019
+++ src/sys/compat/netbsd32/netbsd32_fs.c	Sun Apr 24 16:39:00 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_fs.c,v 1.82.4.1 2019/10/16 17:29:49 martin Exp $	*/
+/*	$NetBSD: netbsd32_fs.c,v 1.82.4.2 2022/04/24 16:39:00 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.c,v 1.82.4.1 2019/10/16 17:29:49 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.c,v 1.82.4.2 2022/04/24 16:39:00 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -53,6 +53,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.
 #include <fs/tmpfs/tmpfs_args.h>
 #include <fs/msdosfs/bpb.h>
 #include <fs/msdosfs/msdosfsmount.h>
+#include <fs/udf/udf_mount.h>
 #include <ufs/ufs/ufsmount.h>
 #include <miscfs/nullfs/null.h>
 
@@ -794,6 +795,7 @@ netbsd32___mount50(struct lwp *l, const 
 		struct netbsd32_iso_args iso_args;
 		struct netbsd32_nfs_args nfs_args;
 		struct netbsd32_msdosfs_args msdosfs_args;
+		struct netbsd32_udf_args udf_args;
 		struct netbsd32_tmpfs_args tmpfs_args;
 		struct netbsd32_null_args null_args;
 	} fs_args32;
@@ -803,6 +805,7 @@ netbsd32___mount50(struct lwp *l, const 
 		struct iso_args iso_args;
 		struct nfs_args nfs_args;
 		struct msdosfs_args msdosfs_args;
+		struct udf_args udf_args;
 		struct tmpfs_args tmpfs_args;
 		struct null_args null_args;
 	} fs_args;
@@ -928,6 +931,40 @@ netbsd32___mount50(struct lwp *l, const 
 		data_seg = UIO_SYSSPACE;
 		data = &fs_args.msdosfs_args;
 		data_len = sizeof(fs_args.msdosfs_args);
+	} else if (strcmp(mtype, MOUNT_UDF) == 0) {
+		if (data_len != 0 && data_len < sizeof(fs_args32.udf_args))
+			return EINVAL;
+		if ((flags & MNT_GETARGS) == 0) {
+			error = copyin(data, &fs_args32.udf_args,
+			    sizeof(fs_args32.udf_args));
+			if (error)
+				return error;
+			fs_args.udf_args.version =
+			    fs_args32.udf_args.version;
+			fs_args.udf_args.fspec =
+			    NETBSD32PTR64(fs_args32.udf_args.fspec);
+			fs_args.udf_args.sessionnr =
+			    fs_args32.udf_args.sessionnr;
+			fs_args.udf_args.udfmflags =
+			    fs_args32.udf_args.udfmflags;
+			fs_args.udf_args.gmtoff =
+			    fs_args32.udf_args.gmtoff;
+			fs_args.udf_args.anon_uid =
+			    fs_args32.udf_args.anon_uid;
+			fs_args.udf_args.anon_gid =
+			    fs_args32.udf_args.anon_gid;
+			fs_args.udf_args.nobody_uid =
+			    fs_args32.udf_args.nobody_uid;
+			fs_args.udf_args.nobody_gid =
+			    fs_args32.udf_args.nobody_gid;
+			fs_args.udf_args.sector_size =
+			    fs_args32.udf_args.sector_size;
+			memset(fs_args.udf_args.reserved, 0,
+			    sizeof(fs_args.udf_args.reserved));
+		}
+		data_seg = UIO_SYSSPACE;
+		data = &fs_args.udf_args;
+		data_len = sizeof(fs_args.udf_args);
 	} else if (strcmp(mtype, MOUNT_NFS) == 0) {
 		if (data_len < sizeof(fs_args32.nfs_args))
 			return EINVAL;
@@ -1031,6 +1068,35 @@ netbsd32___mount50(struct lwp *l, const 
 			error = copyout(&fs_args32.iso_args, udata,
 				    sizeof(fs_args32.iso_args));
 			*retval = sizeof(fs_args32.iso_args);
+		} else if (strcmp(mtype, MOUNT_UDF) == 0) {
+			if (data_len != 0 &&
+			    data_len != sizeof(fs_args.udf_args))
+				return EINVAL;
+			fs_args32.udf_args.version =
+			    fs_args.udf_args.version;
+			NETBSD32PTR32(fs_args32.udf_args.fspec,
+			    fs_args.udf_args.fspec);
+			fs_args32.udf_args.sessionnr =
+			    fs_args.udf_args.sessionnr;
+			fs_args32.udf_args.udfmflags =
+			    fs_args.udf_args.udfmflags;
+			fs_args32.udf_args.gmtoff =
+			    fs_args.udf_args.gmtoff;
+			fs_args32.udf_args.anon_uid =
+			    fs_args.udf_args.anon_uid;
+			fs_args32.udf_args.anon_gid =
+			    fs_args.udf_args.anon_gid;
+			fs_args32.udf_args.nobody_uid =
+			    fs_args.udf_args.nobody_uid;
+			fs_args32.udf_args.nobody_gid =
+			    fs_args.udf_args.nobody_gid;
+			fs_args32.udf_args.sector_size =
+			    fs_args.udf_args.sector_size;
+			memset(fs_args32.udf_args.reserved, 0,
+			    sizeof(fs_args32.udf_args.reserved));
+			error = copyout(&fs_args32.udf_args, udata,
+				    sizeof(fs_args32.udf_args));
+			*retval = sizeof(fs_args32.udf_args);
 		} else if (strcmp(mtype, MOUNT_NFS) == 0) {
 			if (data_len != sizeof(fs_args.nfs_args))
 				return EINVAL;

Index: src/sys/fs/udf/udf_subr.c
diff -u src/sys/fs/udf/udf_subr.c:1.146.2.2 src/sys/fs/udf/udf_subr.c:1.146.2.3
--- src/sys/fs/udf/udf_subr.c:1.146.2.2	Sun Mar 13 09:48:32 2022
+++ src/sys/fs/udf/udf_subr.c	Sun Apr 24 16:39:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_subr.c,v 1.146.2.2 2022/03/13 09:48:32 martin Exp $ */
+/* $NetBSD: udf_subr.c,v 1.146.2.3 2022/04/24 16:39:00 martin 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.146.2.2 2022/03/13 09:48:32 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.146.2.3 2022/04/24 16:39:00 martin Exp $");
 #endif /* not lint */
 
 
@@ -2439,11 +2439,11 @@ udf_extattr_search_intern(struct udf_nod
 		if ((a_l == 0) || (a_l > l_ea))
 			return EINVAL;
 
-		if (attrhdr->type != sattr)
+		if (udf_rw32(attrhdr->type) != sattr)
 			goto next_attribute;
 
 		/* we might have found it! */
-		if (attrhdr->type < 2048) {	/* Ecma-167 attribute */
+		if (udf_rw32(attrhdr->type) < 2048) {	/* Ecma-167 attribute */
 			*offsetp = offset;
 			*lengthp = a_l;
 			return 0;		/* success */

Reply via email to