| @@ -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 | |
1135 | int | | 1141 | int |
1136 | netbsd32_linkat(struct lwp *l, const struct netbsd32_linkat_args *uap, | | 1142 | netbsd32_linkat(struct lwp *l, const struct netbsd32_linkat_args *uap, |