diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2006-02-01 05:16:15 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2006-02-08 01:03:26 -0500 |
commit | 24954a1418298058399581d6fcc4d46e928e1bf5 (patch) | |
tree | 73674aefd63d1559f532ae3e4ad7328d17b3d458 /arch/s390 | |
parent | 290f10ae4230ef06b71e57673101b7e70c1b29a6 (diff) |
[PATCH] s390x compat __user annotations
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/kernel/compat_linux.c | 83 |
1 files changed, 42 insertions, 41 deletions
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index bf9a7a361b34..cc20f0e3a7d3 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -100,12 +100,12 @@ | |||
100 | #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) | 100 | #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) |
101 | #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) | 101 | #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) |
102 | 102 | ||
103 | asmlinkage long sys32_chown16(const char * filename, u16 user, u16 group) | 103 | asmlinkage long sys32_chown16(const char __user * filename, u16 user, u16 group) |
104 | { | 104 | { |
105 | return sys_chown(filename, low2highuid(user), low2highgid(group)); | 105 | return sys_chown(filename, low2highuid(user), low2highgid(group)); |
106 | } | 106 | } |
107 | 107 | ||
108 | asmlinkage long sys32_lchown16(const char * filename, u16 user, u16 group) | 108 | asmlinkage long sys32_lchown16(const char __user * filename, u16 user, u16 group) |
109 | { | 109 | { |
110 | return sys_lchown(filename, low2highuid(user), low2highgid(group)); | 110 | return sys_lchown(filename, low2highuid(user), low2highgid(group)); |
111 | } | 111 | } |
@@ -141,7 +141,7 @@ asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid) | |||
141 | low2highuid(suid)); | 141 | low2highuid(suid)); |
142 | } | 142 | } |
143 | 143 | ||
144 | asmlinkage long sys32_getresuid16(u16 *ruid, u16 *euid, u16 *suid) | 144 | asmlinkage long sys32_getresuid16(u16 __user *ruid, u16 __user *euid, u16 __user *suid) |
145 | { | 145 | { |
146 | int retval; | 146 | int retval; |
147 | 147 | ||
@@ -158,7 +158,7 @@ asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid) | |||
158 | low2highgid(sgid)); | 158 | low2highgid(sgid)); |
159 | } | 159 | } |
160 | 160 | ||
161 | asmlinkage long sys32_getresgid16(u16 *rgid, u16 *egid, u16 *sgid) | 161 | asmlinkage long sys32_getresgid16(u16 __user *rgid, u16 __user *egid, u16 __user *sgid) |
162 | { | 162 | { |
163 | int retval; | 163 | int retval; |
164 | 164 | ||
@@ -179,7 +179,7 @@ asmlinkage long sys32_setfsgid16(u16 gid) | |||
179 | return sys_setfsgid((gid_t)gid); | 179 | return sys_setfsgid((gid_t)gid); |
180 | } | 180 | } |
181 | 181 | ||
182 | static int groups16_to_user(u16 *grouplist, struct group_info *group_info) | 182 | static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info) |
183 | { | 183 | { |
184 | int i; | 184 | int i; |
185 | u16 group; | 185 | u16 group; |
@@ -193,7 +193,7 @@ static int groups16_to_user(u16 *grouplist, struct group_info *group_info) | |||
193 | return 0; | 193 | return 0; |
194 | } | 194 | } |
195 | 195 | ||
196 | static int groups16_from_user(struct group_info *group_info, u16 *grouplist) | 196 | static int groups16_from_user(struct group_info *group_info, u16 __user *grouplist) |
197 | { | 197 | { |
198 | int i; | 198 | int i; |
199 | u16 group; | 199 | u16 group; |
@@ -207,7 +207,7 @@ static int groups16_from_user(struct group_info *group_info, u16 *grouplist) | |||
207 | return 0; | 207 | return 0; |
208 | } | 208 | } |
209 | 209 | ||
210 | asmlinkage long sys32_getgroups16(int gidsetsize, u16 *grouplist) | 210 | asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist) |
211 | { | 211 | { |
212 | int i; | 212 | int i; |
213 | 213 | ||
@@ -231,7 +231,7 @@ out: | |||
231 | return i; | 231 | return i; |
232 | } | 232 | } |
233 | 233 | ||
234 | asmlinkage long sys32_setgroups16(int gidsetsize, u16 *grouplist) | 234 | asmlinkage long sys32_setgroups16(int gidsetsize, u16 __user *grouplist) |
235 | { | 235 | { |
236 | struct group_info *group_info; | 236 | struct group_info *group_info; |
237 | int retval; | 237 | int retval; |
@@ -278,14 +278,14 @@ asmlinkage long sys32_getegid16(void) | |||
278 | 278 | ||
279 | /* 32-bit timeval and related flotsam. */ | 279 | /* 32-bit timeval and related flotsam. */ |
280 | 280 | ||
281 | static inline long get_tv32(struct timeval *o, struct compat_timeval *i) | 281 | static inline long get_tv32(struct timeval *o, struct compat_timeval __user *i) |
282 | { | 282 | { |
283 | return (!access_ok(VERIFY_READ, o, sizeof(*o)) || | 283 | return (!access_ok(VERIFY_READ, o, sizeof(*o)) || |
284 | (__get_user(o->tv_sec, &i->tv_sec) || | 284 | (__get_user(o->tv_sec, &i->tv_sec) || |
285 | __get_user(o->tv_usec, &i->tv_usec))); | 285 | __get_user(o->tv_usec, &i->tv_usec))); |
286 | } | 286 | } |
287 | 287 | ||
288 | static inline long put_tv32(struct compat_timeval *o, struct timeval *i) | 288 | static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i) |
289 | { | 289 | { |
290 | return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || | 290 | return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || |
291 | (__put_user(i->tv_sec, &o->tv_sec) || | 291 | (__put_user(i->tv_sec, &o->tv_sec) || |
@@ -341,7 +341,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) | |||
341 | return -ENOSYS; | 341 | return -ENOSYS; |
342 | } | 342 | } |
343 | 343 | ||
344 | asmlinkage long sys32_truncate64(const char * path, unsigned long high, unsigned long low) | 344 | asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low) |
345 | { | 345 | { |
346 | if ((int)high < 0) | 346 | if ((int)high < 0) |
347 | return -EINVAL; | 347 | return -EINVAL; |
@@ -357,7 +357,7 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned | |||
357 | return sys_ftruncate(fd, (high << 32) | low); | 357 | return sys_ftruncate(fd, (high << 32) | low); |
358 | } | 358 | } |
359 | 359 | ||
360 | int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf) | 360 | int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) |
361 | { | 361 | { |
362 | int err; | 362 | int err; |
363 | 363 | ||
@@ -591,7 +591,7 @@ sys32_delete_module(const char __user *name_user, unsigned int flags) | |||
591 | 591 | ||
592 | extern struct timezone sys_tz; | 592 | extern struct timezone sys_tz; |
593 | 593 | ||
594 | asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz) | 594 | asmlinkage long sys32_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) |
595 | { | 595 | { |
596 | if (tv) { | 596 | if (tv) { |
597 | struct timeval ktv; | 597 | struct timeval ktv; |
@@ -606,7 +606,7 @@ asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *t | |||
606 | return 0; | 606 | return 0; |
607 | } | 607 | } |
608 | 608 | ||
609 | static inline long get_ts32(struct timespec *o, struct compat_timeval *i) | 609 | static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i) |
610 | { | 610 | { |
611 | long usec; | 611 | long usec; |
612 | 612 | ||
@@ -620,7 +620,7 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i) | |||
620 | return 0; | 620 | return 0; |
621 | } | 621 | } |
622 | 622 | ||
623 | asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz) | 623 | asmlinkage long sys32_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) |
624 | { | 624 | { |
625 | struct timespec kts; | 625 | struct timespec kts; |
626 | struct timezone ktz; | 626 | struct timezone ktz; |
@@ -645,7 +645,7 @@ asmlinkage long sys32_pause(void) | |||
645 | return -ERESTARTNOHAND; | 645 | return -ERESTARTNOHAND; |
646 | } | 646 | } |
647 | 647 | ||
648 | asmlinkage long sys32_pread64(unsigned int fd, char *ubuf, | 648 | asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf, |
649 | size_t count, u32 poshi, u32 poslo) | 649 | size_t count, u32 poshi, u32 poslo) |
650 | { | 650 | { |
651 | if ((compat_ssize_t) count < 0) | 651 | if ((compat_ssize_t) count < 0) |
@@ -653,7 +653,7 @@ asmlinkage long sys32_pread64(unsigned int fd, char *ubuf, | |||
653 | return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo)); | 653 | return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo)); |
654 | } | 654 | } |
655 | 655 | ||
656 | asmlinkage long sys32_pwrite64(unsigned int fd, const char *ubuf, | 656 | asmlinkage long sys32_pwrite64(unsigned int fd, const char __user *ubuf, |
657 | size_t count, u32 poshi, u32 poslo) | 657 | size_t count, u32 poshi, u32 poslo) |
658 | { | 658 | { |
659 | if ((compat_ssize_t) count < 0) | 659 | if ((compat_ssize_t) count < 0) |
@@ -666,7 +666,7 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun | |||
666 | return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count); | 666 | return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count); |
667 | } | 667 | } |
668 | 668 | ||
669 | asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size_t count) | 669 | asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, size_t count) |
670 | { | 670 | { |
671 | mm_segment_t old_fs = get_fs(); | 671 | mm_segment_t old_fs = get_fs(); |
672 | int ret; | 672 | int ret; |
@@ -686,7 +686,7 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size | |||
686 | } | 686 | } |
687 | 687 | ||
688 | asmlinkage long sys32_sendfile64(int out_fd, int in_fd, | 688 | asmlinkage long sys32_sendfile64(int out_fd, int in_fd, |
689 | compat_loff_t *offset, s32 count) | 689 | compat_loff_t __user *offset, s32 count) |
690 | { | 690 | { |
691 | mm_segment_t old_fs = get_fs(); | 691 | mm_segment_t old_fs = get_fs(); |
692 | int ret; | 692 | int ret; |
@@ -722,7 +722,7 @@ struct timex32 { | |||
722 | 722 | ||
723 | extern int do_adjtimex(struct timex *); | 723 | extern int do_adjtimex(struct timex *); |
724 | 724 | ||
725 | asmlinkage long sys32_adjtimex(struct timex32 *utp) | 725 | asmlinkage long sys32_adjtimex(struct timex32 __user *utp) |
726 | { | 726 | { |
727 | struct timex txc; | 727 | struct timex txc; |
728 | int ret; | 728 | int ret; |
@@ -789,12 +789,13 @@ struct __sysctl_args32 { | |||
789 | u32 __unused[4]; | 789 | u32 __unused[4]; |
790 | }; | 790 | }; |
791 | 791 | ||
792 | asmlinkage long sys32_sysctl(struct __sysctl_args32 *args) | 792 | asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) |
793 | { | 793 | { |
794 | struct __sysctl_args32 tmp; | 794 | struct __sysctl_args32 tmp; |
795 | int error; | 795 | int error; |
796 | size_t oldlen, *oldlenp = NULL; | 796 | size_t oldlen; |
797 | unsigned long addr = (((long)&args->__unused[0]) + 7) & ~7; | 797 | size_t __user *oldlenp = NULL; |
798 | unsigned long addr = (((unsigned long)&args->__unused[0]) + 7) & ~7; | ||
798 | 799 | ||
799 | if (copy_from_user(&tmp, args, sizeof(tmp))) | 800 | if (copy_from_user(&tmp, args, sizeof(tmp))) |
800 | return -EFAULT; | 801 | return -EFAULT; |
@@ -806,20 +807,20 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 *args) | |||
806 | basically copy the whole sysctl.c here, and | 807 | basically copy the whole sysctl.c here, and |
807 | glibc's __sysctl uses rw memory for the structure | 808 | glibc's __sysctl uses rw memory for the structure |
808 | anyway. */ | 809 | anyway. */ |
809 | if (get_user(oldlen, (u32 *)A(tmp.oldlenp)) || | 810 | if (get_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp)) || |
810 | put_user(oldlen, (size_t *)addr)) | 811 | put_user(oldlen, (size_t __user *)addr)) |
811 | return -EFAULT; | 812 | return -EFAULT; |
812 | oldlenp = (size_t *)addr; | 813 | oldlenp = (size_t __user *)addr; |
813 | } | 814 | } |
814 | 815 | ||
815 | lock_kernel(); | 816 | lock_kernel(); |
816 | error = do_sysctl((int *)A(tmp.name), tmp.nlen, (void *)A(tmp.oldval), | 817 | error = do_sysctl(compat_ptr(tmp.name), tmp.nlen, compat_ptr(tmp.oldval), |
817 | oldlenp, (void *)A(tmp.newval), tmp.newlen); | 818 | oldlenp, compat_ptr(tmp.newval), tmp.newlen); |
818 | unlock_kernel(); | 819 | unlock_kernel(); |
819 | if (oldlenp) { | 820 | if (oldlenp) { |
820 | if (!error) { | 821 | if (!error) { |
821 | if (get_user(oldlen, (size_t *)addr) || | 822 | if (get_user(oldlen, (size_t __user *)addr) || |
822 | put_user(oldlen, (u32 *)A(tmp.oldlenp))) | 823 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) |
823 | error = -EFAULT; | 824 | error = -EFAULT; |
824 | } | 825 | } |
825 | copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); | 826 | copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); |
@@ -853,7 +854,7 @@ struct stat64_emu31 { | |||
853 | unsigned long st_ino; | 854 | unsigned long st_ino; |
854 | }; | 855 | }; |
855 | 856 | ||
856 | static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat) | 857 | static int cp_stat64(struct stat64_emu31 __user *ubuf, struct kstat *stat) |
857 | { | 858 | { |
858 | struct stat64_emu31 tmp; | 859 | struct stat64_emu31 tmp; |
859 | 860 | ||
@@ -877,7 +878,7 @@ static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat) | |||
877 | return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; | 878 | return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; |
878 | } | 879 | } |
879 | 880 | ||
880 | asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf) | 881 | asmlinkage long sys32_stat64(char __user * filename, struct stat64_emu31 __user * statbuf) |
881 | { | 882 | { |
882 | struct kstat stat; | 883 | struct kstat stat; |
883 | int ret = vfs_stat(filename, &stat); | 884 | int ret = vfs_stat(filename, &stat); |
@@ -886,7 +887,7 @@ asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf) | |||
886 | return ret; | 887 | return ret; |
887 | } | 888 | } |
888 | 889 | ||
889 | asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf) | 890 | asmlinkage long sys32_lstat64(char __user * filename, struct stat64_emu31 __user * statbuf) |
890 | { | 891 | { |
891 | struct kstat stat; | 892 | struct kstat stat; |
892 | int ret = vfs_lstat(filename, &stat); | 893 | int ret = vfs_lstat(filename, &stat); |
@@ -895,7 +896,7 @@ asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf) | |||
895 | return ret; | 896 | return ret; |
896 | } | 897 | } |
897 | 898 | ||
898 | asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 * statbuf) | 899 | asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 __user * statbuf) |
899 | { | 900 | { |
900 | struct kstat stat; | 901 | struct kstat stat; |
901 | int ret = vfs_fstat(fd, &stat); | 902 | int ret = vfs_fstat(fd, &stat); |
@@ -952,7 +953,7 @@ out: | |||
952 | 953 | ||
953 | 954 | ||
954 | asmlinkage unsigned long | 955 | asmlinkage unsigned long |
955 | old32_mmap(struct mmap_arg_struct_emu31 *arg) | 956 | old32_mmap(struct mmap_arg_struct_emu31 __user *arg) |
956 | { | 957 | { |
957 | struct mmap_arg_struct_emu31 a; | 958 | struct mmap_arg_struct_emu31 a; |
958 | int error = -EFAULT; | 959 | int error = -EFAULT; |
@@ -970,7 +971,7 @@ out: | |||
970 | } | 971 | } |
971 | 972 | ||
972 | asmlinkage long | 973 | asmlinkage long |
973 | sys32_mmap2(struct mmap_arg_struct_emu31 *arg) | 974 | sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg) |
974 | { | 975 | { |
975 | struct mmap_arg_struct_emu31 a; | 976 | struct mmap_arg_struct_emu31 a; |
976 | int error = -EFAULT; | 977 | int error = -EFAULT; |
@@ -982,7 +983,7 @@ out: | |||
982 | return error; | 983 | return error; |
983 | } | 984 | } |
984 | 985 | ||
985 | asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count) | 986 | asmlinkage long sys32_read(unsigned int fd, char __user * buf, size_t count) |
986 | { | 987 | { |
987 | if ((compat_ssize_t) count < 0) | 988 | if ((compat_ssize_t) count < 0) |
988 | return -EINVAL; | 989 | return -EINVAL; |
@@ -990,7 +991,7 @@ asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count) | |||
990 | return sys_read(fd, buf, count); | 991 | return sys_read(fd, buf, count); |
991 | } | 992 | } |
992 | 993 | ||
993 | asmlinkage long sys32_write(unsigned int fd, char * buf, size_t count) | 994 | asmlinkage long sys32_write(unsigned int fd, char __user * buf, size_t count) |
994 | { | 995 | { |
995 | if ((compat_ssize_t) count < 0) | 996 | if ((compat_ssize_t) count < 0) |
996 | return -EINVAL; | 997 | return -EINVAL; |
@@ -1002,12 +1003,12 @@ asmlinkage long sys32_clone(struct pt_regs regs) | |||
1002 | { | 1003 | { |
1003 | unsigned long clone_flags; | 1004 | unsigned long clone_flags; |
1004 | unsigned long newsp; | 1005 | unsigned long newsp; |
1005 | int *parent_tidptr, *child_tidptr; | 1006 | int __user *parent_tidptr, *child_tidptr; |
1006 | 1007 | ||
1007 | clone_flags = regs.gprs[3] & 0xffffffffUL; | 1008 | clone_flags = regs.gprs[3] & 0xffffffffUL; |
1008 | newsp = regs.orig_gpr2 & 0x7fffffffUL; | 1009 | newsp = regs.orig_gpr2 & 0x7fffffffUL; |
1009 | parent_tidptr = (int *) (regs.gprs[4] & 0x7fffffffUL); | 1010 | parent_tidptr = compat_ptr(regs.gprs[4]); |
1010 | child_tidptr = (int *) (regs.gprs[5] & 0x7fffffffUL); | 1011 | child_tidptr = compat_ptr(regs.gprs[5]); |
1011 | if (!newsp) | 1012 | if (!newsp) |
1012 | newsp = regs.gprs[15]; | 1013 | newsp = regs.gprs[15]; |
1013 | return do_fork(clone_flags, newsp, ®s, 0, | 1014 | return do_fork(clone_flags, newsp, ®s, 0, |