Sat Apr 1 15:51:16 2023 UTC ()
Pull up following revision(s) (requested by riastradh in ticket #1620):

	sys/compat/netbsd32/netbsd32_fs.c: revision 1.89

data_len == 0 on mount means "the kernel knows". Fixes amd on compat32.


(martin)
diff -r1.82.4.3 -r1.82.4.4 src/sys/compat/netbsd32/netbsd32_fs.c

cvs diff -r1.82.4.3 -r1.82.4.4 src/sys/compat/netbsd32/netbsd32_fs.c (expand / switch to unified diff)

--- src/sys/compat/netbsd32/netbsd32_fs.c 2022/08/03 11:05:51 1.82.4.3
+++ src/sys/compat/netbsd32/netbsd32_fs.c 2023/04/01 15:51:16 1.82.4.4
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: netbsd32_fs.c,v 1.82.4.3 2022/08/03 11:05:51 martin Exp $ */ 1/* $NetBSD: netbsd32_fs.c,v 1.82.4.4 2023/04/01 15:51:16 martin Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1998, 2001 Matthew R. Green 4 * Copyright (c) 1998, 2001 Matthew R. Green
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -17,27 +17,27 @@ @@ -17,27 +17,27 @@
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE. 26 * SUCH DAMAGE.
27 */ 27 */
28 28
29#include <sys/cdefs.h> 29#include <sys/cdefs.h>
30__KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.c,v 1.82.4.3 2022/08/03 11:05:51 martin Exp $"); 30__KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.c,v 1.82.4.4 2023/04/01 15:51:16 martin Exp $");
31 31
32#include <sys/param.h> 32#include <sys/param.h>
33#include <sys/systm.h> 33#include <sys/systm.h>
34#include <sys/mount.h> 34#include <sys/mount.h>
35#include <sys/socket.h> 35#include <sys/socket.h>
36#include <sys/socketvar.h> 36#include <sys/socketvar.h>
37#include <sys/stat.h> 37#include <sys/stat.h>
38#include <sys/time.h> 38#include <sys/time.h>
39#include <sys/ktrace.h> 39#include <sys/ktrace.h>
40#include <sys/resourcevar.h> 40#include <sys/resourcevar.h>
41#include <sys/vnode.h> 41#include <sys/vnode.h>
42#include <sys/file.h> 42#include <sys/file.h>
43#include <sys/filedesc.h> 43#include <sys/filedesc.h>
@@ -818,86 +818,86 @@ netbsd32___mount50(struct lwp *l, const  @@ -818,86 +818,86 @@ netbsd32___mount50(struct lwp *l, const
818 size_t data_len = SCARG(uap, data_len); 818 size_t data_len = SCARG(uap, data_len);
819 enum uio_seg data_seg; 819 enum uio_seg data_seg;
820 size_t len; 820 size_t len;
821 int error; 821 int error;
822  822
823 udata = data = SCARG_P32(uap, data); 823 udata = data = SCARG_P32(uap, data);
824 memset(&fs_args32, 0, sizeof(fs_args32)); 824 memset(&fs_args32, 0, sizeof(fs_args32));
825 825
826 error = copyinstr(type, mtype, sizeof(mtype), &len); 826 error = copyinstr(type, mtype, sizeof(mtype), &len);
827 if (error) 827 if (error)
828 return error; 828 return error;
829 829
830 if (strcmp(mtype, MOUNT_TMPFS) == 0) { 830 if (strcmp(mtype, MOUNT_TMPFS) == 0) {
831 if (data_len < sizeof(fs_args32.tmpfs_args)) 831 if (data_len != 0 && data_len < sizeof(fs_args32.tmpfs_args))
832 return EINVAL; 832 return EINVAL;
833 if ((flags & MNT_GETARGS) == 0) { 833 if ((flags & MNT_GETARGS) == 0) {
834 error = copyin(data, &fs_args32.tmpfs_args,  834 error = copyin(data, &fs_args32.tmpfs_args,
835 sizeof(fs_args32.tmpfs_args)); 835 sizeof(fs_args32.tmpfs_args));
836 if (error) 836 if (error)
837 return error; 837 return error;
838 fs_args.tmpfs_args.ta_version = 838 fs_args.tmpfs_args.ta_version =
839 fs_args32.tmpfs_args.ta_version; 839 fs_args32.tmpfs_args.ta_version;
840 fs_args.tmpfs_args.ta_nodes_max = 840 fs_args.tmpfs_args.ta_nodes_max =
841 fs_args32.tmpfs_args.ta_nodes_max; 841 fs_args32.tmpfs_args.ta_nodes_max;
842 fs_args.tmpfs_args.ta_size_max = 842 fs_args.tmpfs_args.ta_size_max =
843 fs_args32.tmpfs_args.ta_size_max; 843 fs_args32.tmpfs_args.ta_size_max;
844 fs_args.tmpfs_args.ta_root_uid = 844 fs_args.tmpfs_args.ta_root_uid =
845 fs_args32.tmpfs_args.ta_root_uid; 845 fs_args32.tmpfs_args.ta_root_uid;
846 fs_args.tmpfs_args.ta_root_gid = 846 fs_args.tmpfs_args.ta_root_gid =
847 fs_args32.tmpfs_args.ta_root_gid; 847 fs_args32.tmpfs_args.ta_root_gid;
848 fs_args.tmpfs_args.ta_root_mode = 848 fs_args.tmpfs_args.ta_root_mode =
849 fs_args32.tmpfs_args.ta_root_mode; 849 fs_args32.tmpfs_args.ta_root_mode;
850 } 850 }
851 data_seg = UIO_SYSSPACE; 851 data_seg = UIO_SYSSPACE;
852 data = &fs_args.tmpfs_args; 852 data = &fs_args.tmpfs_args;
853 data_len = sizeof(fs_args.tmpfs_args); 853 data_len = sizeof(fs_args.tmpfs_args);
854 } else if (strcmp(mtype, MOUNT_MFS) == 0) { 854 } else if (strcmp(mtype, MOUNT_MFS) == 0) {
855 if (data_len < sizeof(fs_args32.mfs_args)) 855 if (data_len != 0 && data_len < sizeof(fs_args32.mfs_args))
856 return EINVAL; 856 return EINVAL;
857 if ((flags & MNT_GETARGS) == 0) { 857 if ((flags & MNT_GETARGS) == 0) {
858 error = copyin(data, &fs_args32.mfs_args,  858 error = copyin(data, &fs_args32.mfs_args,
859 sizeof(fs_args32.mfs_args)); 859 sizeof(fs_args32.mfs_args));
860 if (error) 860 if (error)
861 return error; 861 return error;
862 fs_args.mfs_args.fspec = 862 fs_args.mfs_args.fspec =
863 NETBSD32PTR64(fs_args32.mfs_args.fspec); 863 NETBSD32PTR64(fs_args32.mfs_args.fspec);
864 memset(&fs_args.mfs_args._pad1, 0, 864 memset(&fs_args.mfs_args._pad1, 0,
865 sizeof(fs_args.mfs_args._pad1)); 865 sizeof(fs_args.mfs_args._pad1));
866 fs_args.mfs_args.base = 866 fs_args.mfs_args.base =
867 NETBSD32PTR64(fs_args32.mfs_args.base); 867 NETBSD32PTR64(fs_args32.mfs_args.base);
868 fs_args.mfs_args.size = fs_args32.mfs_args.size; 868 fs_args.mfs_args.size = fs_args32.mfs_args.size;
869 } 869 }
870 data_seg = UIO_SYSSPACE; 870 data_seg = UIO_SYSSPACE;
871 data = &fs_args.mfs_args; 871 data = &fs_args.mfs_args;
872 data_len = sizeof(fs_args.mfs_args); 872 data_len = sizeof(fs_args.mfs_args);
873 } else if ((strcmp(mtype, MOUNT_UFS) == 0) || 873 } else if ((strcmp(mtype, MOUNT_UFS) == 0) ||
874 (strcmp(mtype, MOUNT_EXT2FS) == 0) || 874 (strcmp(mtype, MOUNT_EXT2FS) == 0) ||
875 (strcmp(mtype, MOUNT_LFS) == 0)) { 875 (strcmp(mtype, MOUNT_LFS) == 0)) {
876 if (data_len < sizeof(fs_args32.ufs_args)) 876 if (data_len != 0 && data_len < sizeof(fs_args32.ufs_args))
877 return EINVAL; 877 return EINVAL;
878 if ((flags & MNT_GETARGS) == 0) { 878 if ((flags & MNT_GETARGS) == 0) {
879 error = copyin(data, &fs_args32.ufs_args,  879 error = copyin(data, &fs_args32.ufs_args,
880 sizeof(fs_args32.ufs_args)); 880 sizeof(fs_args32.ufs_args));
881 if (error) 881 if (error)
882 return error; 882 return error;
883 fs_args.ufs_args.fspec = 883 fs_args.ufs_args.fspec =
884 NETBSD32PTR64(fs_args32.ufs_args.fspec); 884 NETBSD32PTR64(fs_args32.ufs_args.fspec);
885 } 885 }
886 data_seg = UIO_SYSSPACE; 886 data_seg = UIO_SYSSPACE;
887 data = &fs_args.ufs_args; 887 data = &fs_args.ufs_args;
888 data_len = sizeof(fs_args.ufs_args); 888 data_len = sizeof(fs_args.ufs_args);
889 } else if (strcmp(mtype, MOUNT_CD9660) == 0) { 889 } else if (strcmp(mtype, MOUNT_CD9660) == 0) {
890 if (data_len < sizeof(fs_args32.iso_args)) 890 if (data_len != 0 && data_len < sizeof(fs_args32.iso_args))
891 return EINVAL; 891 return EINVAL;
892 if ((flags & MNT_GETARGS) == 0) { 892 if ((flags & MNT_GETARGS) == 0) {
893 error = copyin(data, &fs_args32.iso_args,  893 error = copyin(data, &fs_args32.iso_args,
894 sizeof(fs_args32.iso_args)); 894 sizeof(fs_args32.iso_args));
895 if (error) 895 if (error)
896 return error; 896 return error;
897 fs_args.iso_args.fspec = 897 fs_args.iso_args.fspec =
898 NETBSD32PTR64(fs_args32.iso_args.fspec); 898 NETBSD32PTR64(fs_args32.iso_args.fspec);
899 memset(&fs_args.iso_args._pad1, 0, 899 memset(&fs_args.iso_args._pad1, 0,
900 sizeof(fs_args.iso_args._pad1)); 900 sizeof(fs_args.iso_args._pad1));
901 fs_args.iso_args.flags = fs_args32.iso_args.flags; 901 fs_args.iso_args.flags = fs_args32.iso_args.flags;
902 } 902 }
903 data_seg = UIO_SYSSPACE; 903 data_seg = UIO_SYSSPACE;
@@ -958,27 +958,27 @@ netbsd32___mount50(struct lwp *l, const  @@ -958,27 +958,27 @@ netbsd32___mount50(struct lwp *l, const
958 fs_args.udf_args.nobody_uid = 958 fs_args.udf_args.nobody_uid =
959 fs_args32.udf_args.nobody_uid; 959 fs_args32.udf_args.nobody_uid;
960 fs_args.udf_args.nobody_gid = 960 fs_args.udf_args.nobody_gid =
961 fs_args32.udf_args.nobody_gid; 961 fs_args32.udf_args.nobody_gid;
962 fs_args.udf_args.sector_size = 962 fs_args.udf_args.sector_size =
963 fs_args32.udf_args.sector_size; 963 fs_args32.udf_args.sector_size;
964 memset(fs_args.udf_args.reserved, 0, 964 memset(fs_args.udf_args.reserved, 0,
965 sizeof(fs_args.udf_args.reserved)); 965 sizeof(fs_args.udf_args.reserved));
966 } 966 }
967 data_seg = UIO_SYSSPACE; 967 data_seg = UIO_SYSSPACE;
968 data = &fs_args.udf_args; 968 data = &fs_args.udf_args;
969 data_len = sizeof(fs_args.udf_args); 969 data_len = sizeof(fs_args.udf_args);
970 } else if (strcmp(mtype, MOUNT_NFS) == 0) { 970 } else if (strcmp(mtype, MOUNT_NFS) == 0) {
971 if (data_len < sizeof(fs_args32.nfs_args)) 971 if (data_len != 0 && data_len < sizeof(fs_args32.nfs_args))
972 return EINVAL; 972 return EINVAL;
973 /* XXX: NFS requires copyin even with MNT_GETARGS */ 973 /* XXX: NFS requires copyin even with MNT_GETARGS */
974 if ((flags & MNT_GETARGS) == 0) { 974 if ((flags & MNT_GETARGS) == 0) {
975 error = copyin(data, &fs_args32.nfs_args,  975 error = copyin(data, &fs_args32.nfs_args,
976 sizeof(fs_args32.nfs_args)); 976 sizeof(fs_args32.nfs_args));
977 if (error) 977 if (error)
978 return error; 978 return error;
979 fs_args.nfs_args.version = fs_args32.nfs_args.version; 979 fs_args.nfs_args.version = fs_args32.nfs_args.version;
980 fs_args.nfs_args.addr = 980 fs_args.nfs_args.addr =
981 NETBSD32PTR64(fs_args32.nfs_args.addr); 981 NETBSD32PTR64(fs_args32.nfs_args.addr);
982 memcpy(&fs_args.nfs_args.addrlen, 982 memcpy(&fs_args.nfs_args.addrlen,
983 &fs_args32.nfs_args.addrlen, 983 &fs_args32.nfs_args.addrlen,
984 offsetof(struct nfs_args, fh) 984 offsetof(struct nfs_args, fh)
@@ -986,91 +986,95 @@ netbsd32___mount50(struct lwp *l, const  @@ -986,91 +986,95 @@ netbsd32___mount50(struct lwp *l, const
986 fs_args.nfs_args.fh = 986 fs_args.nfs_args.fh =
987 NETBSD32PTR64(fs_args32.nfs_args.fh); 987 NETBSD32PTR64(fs_args32.nfs_args.fh);
988 memcpy(&fs_args.nfs_args.fhsize, 988 memcpy(&fs_args.nfs_args.fhsize,
989 &fs_args32.nfs_args.fhsize, 989 &fs_args32.nfs_args.fhsize,
990 offsetof(struct nfs_args, hostname) 990 offsetof(struct nfs_args, hostname)
991 - offsetof(struct nfs_args, fhsize)); 991 - offsetof(struct nfs_args, fhsize));
992 fs_args.nfs_args.hostname = 992 fs_args.nfs_args.hostname =
993 NETBSD32PTR64(fs_args32.nfs_args.hostname); 993 NETBSD32PTR64(fs_args32.nfs_args.hostname);
994 } 994 }
995 data_seg = UIO_SYSSPACE; 995 data_seg = UIO_SYSSPACE;
996 data = &fs_args.nfs_args; 996 data = &fs_args.nfs_args;
997 data_len = sizeof(fs_args.nfs_args); 997 data_len = sizeof(fs_args.nfs_args);
998 } else if (strcmp(mtype, MOUNT_NULL) == 0) { 998 } else if (strcmp(mtype, MOUNT_NULL) == 0) {
999 if (data_len < sizeof(fs_args32.null_args)) 999 if (data_len != 0 && data_len < sizeof(fs_args32.null_args))
1000 return EINVAL; 1000 return EINVAL;
1001 if ((flags & MNT_GETARGS) == 0) { 1001 if ((flags & MNT_GETARGS) == 0) {
1002 error = copyin(data, &fs_args32.null_args,  1002 error = copyin(data, &fs_args32.null_args,
1003 sizeof(fs_args32.null_args)); 1003 sizeof(fs_args32.null_args));
1004 if (error) 1004 if (error)
1005 return error; 1005 return error;
1006 fs_args.null_args.la.target = 1006 fs_args.null_args.la.target =
1007 NETBSD32PTR64(fs_args32.null_args.la.target); 1007 NETBSD32PTR64(fs_args32.null_args.la.target);
1008 } 1008 }
1009 data_seg = UIO_SYSSPACE; 1009 data_seg = UIO_SYSSPACE;
1010 data = &fs_args.null_args; 1010 data = &fs_args.null_args;
1011 data_len = sizeof(fs_args.null_args); 1011 data_len = sizeof(fs_args.null_args);
1012 } else { 1012 } else {
1013 data_seg = UIO_USERSPACE; 1013 data_seg = UIO_USERSPACE;
1014 } 1014 }
1015 1015
1016 error = do_sys_mount(l, mtype, UIO_SYSSPACE, path, flags, data, data_seg, 1016 error = do_sys_mount(l, mtype, UIO_SYSSPACE, path, flags, data, data_seg,
1017 data_len, retval); 1017 data_len, retval);
1018 if (error) 1018 if (error)
1019 return error; 1019 return error;
1020 1020
1021 if (flags & MNT_GETARGS) { 1021 if (flags & MNT_GETARGS) {
1022 data_len = *retval; 1022 data_len = *retval;
1023 if (strcmp(mtype, MOUNT_TMPFS) == 0) { 1023 if (strcmp(mtype, MOUNT_TMPFS) == 0) {
1024 if (data_len != sizeof(fs_args.tmpfs_args)) 1024 if (data_len != 0 &&
 1025 data_len != sizeof(fs_args.tmpfs_args))
1025 return EINVAL; 1026 return EINVAL;
1026 fs_args32.tmpfs_args.ta_version = 1027 fs_args32.tmpfs_args.ta_version =
1027 fs_args.tmpfs_args.ta_version; 1028 fs_args.tmpfs_args.ta_version;
1028 fs_args32.tmpfs_args.ta_nodes_max = 1029 fs_args32.tmpfs_args.ta_nodes_max =
1029 fs_args.tmpfs_args.ta_nodes_max; 1030 fs_args.tmpfs_args.ta_nodes_max;
1030 fs_args32.tmpfs_args.ta_size_max = 1031 fs_args32.tmpfs_args.ta_size_max =
1031 fs_args.tmpfs_args.ta_size_max; 1032 fs_args.tmpfs_args.ta_size_max;
1032 fs_args32.tmpfs_args.ta_root_uid = 1033 fs_args32.tmpfs_args.ta_root_uid =
1033 fs_args.tmpfs_args.ta_root_uid; 1034 fs_args.tmpfs_args.ta_root_uid;
1034 fs_args32.tmpfs_args.ta_root_gid = 1035 fs_args32.tmpfs_args.ta_root_gid =
1035 fs_args.tmpfs_args.ta_root_gid; 1036 fs_args.tmpfs_args.ta_root_gid;
1036 fs_args32.tmpfs_args.ta_root_mode = 1037 fs_args32.tmpfs_args.ta_root_mode =
1037 fs_args.tmpfs_args.ta_root_mode; 1038 fs_args.tmpfs_args.ta_root_mode;
1038 error = copyout(&fs_args32.tmpfs_args, udata, 1039 error = copyout(&fs_args32.tmpfs_args, udata,
1039 sizeof(fs_args32.tmpfs_args)); 1040 sizeof(fs_args32.tmpfs_args));
1040 *retval = sizeof(fs_args32.tmpfs_args); 1041 *retval = sizeof(fs_args32.tmpfs_args);
1041 } else if (strcmp(mtype, MOUNT_MFS) == 0) { 1042 } else if (strcmp(mtype, MOUNT_MFS) == 0) {
1042 if (data_len != sizeof(fs_args.mfs_args)) 1043 if (data_len != 0 &&
 1044 data_len != sizeof(fs_args.mfs_args))
1043 return EINVAL; 1045 return EINVAL;
1044 NETBSD32PTR32(fs_args32.mfs_args.fspec, 1046 NETBSD32PTR32(fs_args32.mfs_args.fspec,
1045 fs_args.mfs_args.fspec); 1047 fs_args.mfs_args.fspec);
1046 memset(&fs_args32.mfs_args._pad1, 0, 1048 memset(&fs_args32.mfs_args._pad1, 0,
1047 sizeof(fs_args32.mfs_args._pad1)); 1049 sizeof(fs_args32.mfs_args._pad1));
1048 NETBSD32PTR32(fs_args32.mfs_args.base, 1050 NETBSD32PTR32(fs_args32.mfs_args.base,
1049 fs_args.mfs_args.base); 1051 fs_args.mfs_args.base);
1050 fs_args32.mfs_args.size = fs_args.mfs_args.size; 1052 fs_args32.mfs_args.size = fs_args.mfs_args.size;
1051 error = copyout(&fs_args32.mfs_args, udata, 1053 error = copyout(&fs_args32.mfs_args, udata,
1052 sizeof(fs_args32.mfs_args)); 1054 sizeof(fs_args32.mfs_args));
1053 *retval = sizeof(fs_args32.mfs_args); 1055 *retval = sizeof(fs_args32.mfs_args);
1054 } else if (strcmp(mtype, MOUNT_UFS) == 0) { 1056 } else if (strcmp(mtype, MOUNT_UFS) == 0) {
1055 if (data_len != sizeof(fs_args.ufs_args)) 1057 if (data_len != 0 &&
 1058 data_len != sizeof(fs_args.ufs_args))
1056 return EINVAL; 1059 return EINVAL;
1057 NETBSD32PTR32(fs_args32.ufs_args.fspec, 1060 NETBSD32PTR32(fs_args32.ufs_args.fspec,
1058 fs_args.ufs_args.fspec); 1061 fs_args.ufs_args.fspec);
1059 error = copyout(&fs_args32.ufs_args, udata,  1062 error = copyout(&fs_args32.ufs_args, udata,
1060 sizeof(fs_args32.ufs_args)); 1063 sizeof(fs_args32.ufs_args));
1061 *retval = sizeof(fs_args32.ufs_args); 1064 *retval = sizeof(fs_args32.ufs_args);
1062 } else if (strcmp(mtype, MOUNT_CD9660) == 0) { 1065 } else if (strcmp(mtype, MOUNT_CD9660) == 0) {
1063 if (data_len != sizeof(fs_args.iso_args)) 1066 if (data_len != 0 &&
 1067 data_len != sizeof(fs_args.iso_args))
1064 return EINVAL; 1068 return EINVAL;
1065 NETBSD32PTR32(fs_args32.iso_args.fspec, 1069 NETBSD32PTR32(fs_args32.iso_args.fspec,
1066 fs_args.iso_args.fspec); 1070 fs_args.iso_args.fspec);
1067 memset(&fs_args32.iso_args._pad1, 0, 1071 memset(&fs_args32.iso_args._pad1, 0,
1068 sizeof(fs_args32.iso_args._pad1)); 1072 sizeof(fs_args32.iso_args._pad1));
1069 fs_args32.iso_args.flags = fs_args.iso_args.flags; 1073 fs_args32.iso_args.flags = fs_args.iso_args.flags;
1070 error = copyout(&fs_args32.iso_args, udata, 1074 error = copyout(&fs_args32.iso_args, udata,
1071 sizeof(fs_args32.iso_args)); 1075 sizeof(fs_args32.iso_args));
1072 *retval = sizeof(fs_args32.iso_args); 1076 *retval = sizeof(fs_args32.iso_args);
1073 } else if (strcmp(mtype, MOUNT_UDF) == 0) { 1077 } else if (strcmp(mtype, MOUNT_UDF) == 0) {
1074 if (data_len != 0 && 1078 if (data_len != 0 &&
1075 data_len != sizeof(fs_args.udf_args)) 1079 data_len != sizeof(fs_args.udf_args))
1076 return EINVAL; 1080 return EINVAL;
@@ -1090,47 +1094,49 @@ netbsd32___mount50(struct lwp *l, const  @@ -1090,47 +1094,49 @@ netbsd32___mount50(struct lwp *l, const
1090 fs_args.udf_args.anon_gid; 1094 fs_args.udf_args.anon_gid;
1091 fs_args32.udf_args.nobody_uid = 1095 fs_args32.udf_args.nobody_uid =
1092 fs_args.udf_args.nobody_uid; 1096 fs_args.udf_args.nobody_uid;
1093 fs_args32.udf_args.nobody_gid = 1097 fs_args32.udf_args.nobody_gid =
1094 fs_args.udf_args.nobody_gid; 1098 fs_args.udf_args.nobody_gid;
1095 fs_args32.udf_args.sector_size = 1099 fs_args32.udf_args.sector_size =
1096 fs_args.udf_args.sector_size; 1100 fs_args.udf_args.sector_size;
1097 memset(fs_args32.udf_args.reserved, 0, 1101 memset(fs_args32.udf_args.reserved, 0,
1098 sizeof(fs_args32.udf_args.reserved)); 1102 sizeof(fs_args32.udf_args.reserved));
1099 error = copyout(&fs_args32.udf_args, udata, 1103 error = copyout(&fs_args32.udf_args, udata,
1100 sizeof(fs_args32.udf_args)); 1104 sizeof(fs_args32.udf_args));
1101 *retval = sizeof(fs_args32.udf_args); 1105 *retval = sizeof(fs_args32.udf_args);
1102 } else if (strcmp(mtype, MOUNT_NFS) == 0) { 1106 } else if (strcmp(mtype, MOUNT_NFS) == 0) {
1103 if (data_len != sizeof(fs_args.nfs_args)) 1107 if (data_len != 0 &&
 1108 data_len != sizeof(fs_args.nfs_args))
1104 return EINVAL; 1109 return EINVAL;
1105 NETBSD32PTR32(fs_args32.nfs_args.addr, 1110 NETBSD32PTR32(fs_args32.nfs_args.addr,
1106 fs_args.nfs_args.addr); 1111 fs_args.nfs_args.addr);
1107 memcpy(&fs_args32.nfs_args.addrlen, 1112 memcpy(&fs_args32.nfs_args.addrlen,
1108 &fs_args.nfs_args.addrlen, 1113 &fs_args.nfs_args.addrlen,
1109 offsetof(struct nfs_args, fh) 1114 offsetof(struct nfs_args, fh)
1110 - offsetof(struct nfs_args, addrlen)); 1115 - offsetof(struct nfs_args, addrlen));
1111 NETBSD32PTR32(fs_args32.nfs_args.fh, 1116 NETBSD32PTR32(fs_args32.nfs_args.fh,
1112 fs_args.nfs_args.fh); 1117 fs_args.nfs_args.fh);
1113 memcpy(&fs_args32.nfs_args.fhsize, 1118 memcpy(&fs_args32.nfs_args.fhsize,
1114 &fs_args.nfs_args.fhsize, 1119 &fs_args.nfs_args.fhsize,
1115 offsetof(struct nfs_args, hostname) 1120 offsetof(struct nfs_args, hostname)
1116 - offsetof(struct nfs_args, fhsize)); 1121 - offsetof(struct nfs_args, fhsize));
1117 NETBSD32PTR32(fs_args32.nfs_args.hostname, 1122 NETBSD32PTR32(fs_args32.nfs_args.hostname,
1118 fs_args.nfs_args.hostname); 1123 fs_args.nfs_args.hostname);
1119 error = copyout(&fs_args32.nfs_args, udata, 1124 error = copyout(&fs_args32.nfs_args, udata,
1120 sizeof(fs_args32.nfs_args)); 1125 sizeof(fs_args32.nfs_args));
1121 *retval = sizeof(fs_args32.nfs_args); 1126 *retval = sizeof(fs_args32.nfs_args);
1122 } else if (strcmp(mtype, MOUNT_NULL) == 0) { 1127 } else if (strcmp(mtype, MOUNT_NULL) == 0) {
1123 if (data_len != sizeof(fs_args.null_args)) 1128 if (data_len != 0 &&
 1129 data_len != sizeof(fs_args.null_args))
1124 return EINVAL; 1130 return EINVAL;
1125 NETBSD32PTR32(fs_args32.null_args.la.target, 1131 NETBSD32PTR32(fs_args32.null_args.la.target,
1126 fs_args.null_args.la.target); 1132 fs_args.null_args.la.target);
1127 error = copyout(&fs_args32.null_args, udata,  1133 error = copyout(&fs_args32.null_args, udata,
1128 sizeof(fs_args32.null_args)); 1134 sizeof(fs_args32.null_args));
1129 *retval = sizeof(fs_args32.null_args); 1135 *retval = sizeof(fs_args32.null_args);
1130 } 1136 }
1131 } 1137 }
1132 return error; 1138 return error;
1133} 1139}
1134 1140
1135int 1141int
1136netbsd32_linkat(struct lwp *l, const struct netbsd32_linkat_args *uap, 1142netbsd32_linkat(struct lwp *l, const struct netbsd32_linkat_args *uap,