Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull compat iovec cleanups from Al Viro:
"Christoph's series around import_iovec() and compat variant thereof"

* 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
security/keys: remove compat_keyctl_instantiate_key_iov
mm: remove compat_process_vm_{readv,writev}
fs: remove compat_sys_vmsplice
fs: remove the compat readv/writev syscalls
fs: remove various compat readv/writev helpers
iov_iter: transparently handle compat iovecs in import_iovec
iov_iter: refactor rw_copy_check_uvector and import_iovec
iov_iter: move rw_copy_check_uvector() into lib/iov_iter.c
compat.h: fix a spelling error in <linux/compat.h>

+300 -716
+5 -5
arch/arm64/include/asm/unistd32.h
··· 301 301 #define __NR_msync 144 302 302 __SYSCALL(__NR_msync, sys_msync) 303 303 #define __NR_readv 145 304 - __SYSCALL(__NR_readv, compat_sys_readv) 304 + __SYSCALL(__NR_readv, sys_readv) 305 305 #define __NR_writev 146 306 - __SYSCALL(__NR_writev, compat_sys_writev) 306 + __SYSCALL(__NR_writev, sys_writev) 307 307 #define __NR_getsid 147 308 308 __SYSCALL(__NR_getsid, sys_getsid) 309 309 #define __NR_fdatasync 148 ··· 697 697 #define __NR_tee 342 698 698 __SYSCALL(__NR_tee, sys_tee) 699 699 #define __NR_vmsplice 343 700 - __SYSCALL(__NR_vmsplice, compat_sys_vmsplice) 700 + __SYSCALL(__NR_vmsplice, sys_vmsplice) 701 701 #define __NR_move_pages 344 702 702 __SYSCALL(__NR_move_pages, compat_sys_move_pages) 703 703 #define __NR_getcpu 345 ··· 763 763 #define __NR_setns 375 764 764 __SYSCALL(__NR_setns, sys_setns) 765 765 #define __NR_process_vm_readv 376 766 - __SYSCALL(__NR_process_vm_readv, compat_sys_process_vm_readv) 766 + __SYSCALL(__NR_process_vm_readv, sys_process_vm_readv) 767 767 #define __NR_process_vm_writev 377 768 - __SYSCALL(__NR_process_vm_writev, compat_sys_process_vm_writev) 768 + __SYSCALL(__NR_process_vm_writev, sys_process_vm_writev) 769 769 #define __NR_kcmp 378 770 770 __SYSCALL(__NR_kcmp, sys_kcmp) 771 771 #define __NR_finit_module 379
+5 -5
arch/mips/kernel/syscalls/syscall_n32.tbl
··· 25 25 15 n32 ioctl compat_sys_ioctl 26 26 16 n32 pread64 sys_pread64 27 27 17 n32 pwrite64 sys_pwrite64 28 - 18 n32 readv compat_sys_readv 29 - 19 n32 writev compat_sys_writev 28 + 18 n32 readv sys_readv 29 + 19 n32 writev sys_writev 30 30 20 n32 access sys_access 31 31 21 n32 pipe sysm_pipe 32 32 22 n32 _newselect compat_sys_select ··· 278 278 267 n32 splice sys_splice 279 279 268 n32 sync_file_range sys_sync_file_range 280 280 269 n32 tee sys_tee 281 - 270 n32 vmsplice compat_sys_vmsplice 281 + 270 n32 vmsplice sys_vmsplice 282 282 271 n32 move_pages compat_sys_move_pages 283 283 272 n32 set_robust_list compat_sys_set_robust_list 284 284 273 n32 get_robust_list compat_sys_get_robust_list ··· 317 317 306 n32 syncfs sys_syncfs 318 318 307 n32 sendmmsg compat_sys_sendmmsg 319 319 308 n32 setns sys_setns 320 - 309 n32 process_vm_readv compat_sys_process_vm_readv 321 - 310 n32 process_vm_writev compat_sys_process_vm_writev 320 + 309 n32 process_vm_readv sys_process_vm_readv 321 + 310 n32 process_vm_writev sys_process_vm_writev 322 322 311 n32 kcmp sys_kcmp 323 323 312 n32 finit_module sys_finit_module 324 324 313 n32 sched_setattr sys_sched_setattr
+5 -5
arch/mips/kernel/syscalls/syscall_o32.tbl
··· 156 156 142 o32 _newselect sys_select compat_sys_select 157 157 143 o32 flock sys_flock 158 158 144 o32 msync sys_msync 159 - 145 o32 readv sys_readv compat_sys_readv 160 - 146 o32 writev sys_writev compat_sys_writev 159 + 145 o32 readv sys_readv 160 + 146 o32 writev sys_writev 161 161 147 o32 cacheflush sys_cacheflush 162 162 148 o32 cachectl sys_cachectl 163 163 149 o32 sysmips __sys_sysmips ··· 318 318 304 o32 splice sys_splice 319 319 305 o32 sync_file_range sys_sync_file_range sys32_sync_file_range 320 320 306 o32 tee sys_tee 321 - 307 o32 vmsplice sys_vmsplice compat_sys_vmsplice 321 + 307 o32 vmsplice sys_vmsplice 322 322 308 o32 move_pages sys_move_pages compat_sys_move_pages 323 323 309 o32 set_robust_list sys_set_robust_list compat_sys_set_robust_list 324 324 310 o32 get_robust_list sys_get_robust_list compat_sys_get_robust_list ··· 356 356 342 o32 syncfs sys_syncfs 357 357 343 o32 sendmmsg sys_sendmmsg compat_sys_sendmmsg 358 358 344 o32 setns sys_setns 359 - 345 o32 process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 360 - 346 o32 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 359 + 345 o32 process_vm_readv sys_process_vm_readv 360 + 346 o32 process_vm_writev sys_process_vm_writev 361 361 347 o32 kcmp sys_kcmp 362 362 348 o32 finit_module sys_finit_module 363 363 349 o32 sched_setattr sys_sched_setattr
+5 -5
arch/parisc/kernel/syscalls/syscall.tbl
··· 159 159 142 common _newselect sys_select compat_sys_select 160 160 143 common flock sys_flock 161 161 144 common msync sys_msync 162 - 145 common readv sys_readv compat_sys_readv 163 - 146 common writev sys_writev compat_sys_writev 162 + 145 common readv sys_readv 163 + 146 common writev sys_writev 164 164 147 common getsid sys_getsid 165 165 148 common fdatasync sys_fdatasync 166 166 149 common _sysctl sys_ni_syscall ··· 330 330 292 32 sync_file_range parisc_sync_file_range 331 331 292 64 sync_file_range sys_sync_file_range 332 332 293 common tee sys_tee 333 - 294 common vmsplice sys_vmsplice compat_sys_vmsplice 333 + 294 common vmsplice sys_vmsplice 334 334 295 common move_pages sys_move_pages compat_sys_move_pages 335 335 296 common getcpu sys_getcpu 336 336 297 common epoll_pwait sys_epoll_pwait compat_sys_epoll_pwait ··· 372 372 327 common syncfs sys_syncfs 373 373 328 common setns sys_setns 374 374 329 common sendmmsg sys_sendmmsg compat_sys_sendmmsg 375 - 330 common process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 376 - 331 common process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 375 + 330 common process_vm_readv sys_process_vm_readv 376 + 331 common process_vm_writev sys_process_vm_writev 377 377 332 common kcmp sys_kcmp 378 378 333 common finit_module sys_finit_module 379 379 334 common sched_setattr sys_sched_setattr
+5 -5
arch/powerpc/kernel/syscalls/syscall.tbl
··· 193 193 142 common _newselect sys_select compat_sys_select 194 194 143 common flock sys_flock 195 195 144 common msync sys_msync 196 - 145 common readv sys_readv compat_sys_readv 197 - 146 common writev sys_writev compat_sys_writev 196 + 145 common readv sys_readv 197 + 146 common writev sys_writev 198 198 147 common getsid sys_getsid 199 199 148 common fdatasync sys_fdatasync 200 200 149 nospu _sysctl sys_ni_syscall ··· 369 369 282 common unshare sys_unshare 370 370 283 common splice sys_splice 371 371 284 common tee sys_tee 372 - 285 common vmsplice sys_vmsplice compat_sys_vmsplice 372 + 285 common vmsplice sys_vmsplice 373 373 286 common openat sys_openat compat_sys_openat 374 374 287 common mkdirat sys_mkdirat 375 375 288 common mknodat sys_mknodat ··· 449 449 348 common syncfs sys_syncfs 450 450 349 common sendmmsg sys_sendmmsg compat_sys_sendmmsg 451 451 350 common setns sys_setns 452 - 351 nospu process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 453 - 352 nospu process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 452 + 351 nospu process_vm_readv sys_process_vm_readv 453 + 352 nospu process_vm_writev sys_process_vm_writev 454 454 353 nospu finit_module sys_finit_module 455 455 354 nospu kcmp sys_kcmp 456 456 355 common sched_setattr sys_sched_setattr
+5 -5
arch/s390/kernel/syscalls/syscall.tbl
··· 134 134 142 64 select sys_select - 135 135 143 common flock sys_flock sys_flock 136 136 144 common msync sys_msync sys_msync 137 - 145 common readv sys_readv compat_sys_readv 138 - 146 common writev sys_writev compat_sys_writev 137 + 145 common readv sys_readv sys_readv 138 + 146 common writev sys_writev sys_writev 139 139 147 common getsid sys_getsid sys_getsid 140 140 148 common fdatasync sys_fdatasync sys_fdatasync 141 141 149 common _sysctl - - ··· 316 316 306 common splice sys_splice sys_splice 317 317 307 common sync_file_range sys_sync_file_range compat_sys_s390_sync_file_range 318 318 308 common tee sys_tee sys_tee 319 - 309 common vmsplice sys_vmsplice compat_sys_vmsplice 319 + 309 common vmsplice sys_vmsplice sys_vmsplice 320 320 310 common move_pages sys_move_pages compat_sys_move_pages 321 321 311 common getcpu sys_getcpu sys_getcpu 322 322 312 common epoll_pwait sys_epoll_pwait compat_sys_epoll_pwait ··· 347 347 337 common clock_adjtime sys_clock_adjtime sys_clock_adjtime32 348 348 338 common syncfs sys_syncfs sys_syncfs 349 349 339 common setns sys_setns sys_setns 350 - 340 common process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 351 - 341 common process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 350 + 340 common process_vm_readv sys_process_vm_readv sys_process_vm_readv 351 + 341 common process_vm_writev sys_process_vm_writev sys_process_vm_writev 352 352 342 common s390_runtime_instr sys_s390_runtime_instr sys_s390_runtime_instr 353 353 343 common kcmp sys_kcmp sys_kcmp 354 354 344 common finit_module sys_finit_module sys_finit_module
+5 -5
arch/sparc/kernel/syscalls/syscall.tbl
··· 38 38 23 64 setuid sys_setuid 39 39 24 32 getuid sys_getuid16 40 40 24 64 getuid sys_getuid 41 - 25 common vmsplice sys_vmsplice compat_sys_vmsplice 41 + 25 common vmsplice sys_vmsplice 42 42 26 common ptrace sys_ptrace compat_sys_ptrace 43 43 27 common alarm sys_alarm 44 44 28 common sigaltstack sys_sigaltstack compat_sys_sigaltstack ··· 149 149 117 common getrusage sys_getrusage compat_sys_getrusage 150 150 118 common getsockopt sys_getsockopt sys_getsockopt 151 151 119 common getcwd sys_getcwd 152 - 120 common readv sys_readv compat_sys_readv 153 - 121 common writev sys_writev compat_sys_writev 152 + 120 common readv sys_readv 153 + 121 common writev sys_writev 154 154 122 common settimeofday sys_settimeofday compat_sys_settimeofday 155 155 123 32 fchown sys_fchown16 156 156 123 64 fchown sys_fchown ··· 406 406 335 common syncfs sys_syncfs 407 407 336 common sendmmsg sys_sendmmsg compat_sys_sendmmsg 408 408 337 common setns sys_setns 409 - 338 common process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 410 - 339 common process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 409 + 338 common process_vm_readv sys_process_vm_readv 410 + 339 common process_vm_writev sys_process_vm_writev 411 411 340 32 kern_features sys_ni_syscall sys_kern_features 412 412 340 64 kern_features sys_kern_features 413 413 341 common kcmp sys_kcmp
+5
arch/x86/entry/syscall_x32.c
··· 12 12 * Reuse the 64-bit entry points for the x32 versions that occupy different 13 13 * slots in the syscall table. 14 14 */ 15 + #define __x32_sys_readv __x64_sys_readv 16 + #define __x32_sys_writev __x64_sys_writev 15 17 #define __x32_sys_getsockopt __x64_sys_getsockopt 16 18 #define __x32_sys_setsockopt __x64_sys_setsockopt 19 + #define __x32_sys_vmsplice __x64_sys_vmsplice 20 + #define __x32_sys_process_vm_readv __x64_sys_process_vm_readv 21 + #define __x32_sys_process_vm_writev __x64_sys_process_vm_writev 17 22 18 23 #define __SYSCALL_64(nr, sym) 19 24
+5 -5
arch/x86/entry/syscalls/syscall_32.tbl
··· 156 156 142 i386 _newselect sys_select compat_sys_select 157 157 143 i386 flock sys_flock 158 158 144 i386 msync sys_msync 159 - 145 i386 readv sys_readv compat_sys_readv 160 - 146 i386 writev sys_writev compat_sys_writev 159 + 145 i386 readv sys_readv 160 + 146 i386 writev sys_writev 161 161 147 i386 getsid sys_getsid 162 162 148 i386 fdatasync sys_fdatasync 163 163 149 i386 _sysctl sys_ni_syscall ··· 327 327 313 i386 splice sys_splice 328 328 314 i386 sync_file_range sys_ia32_sync_file_range 329 329 315 i386 tee sys_tee 330 - 316 i386 vmsplice sys_vmsplice compat_sys_vmsplice 330 + 316 i386 vmsplice sys_vmsplice 331 331 317 i386 move_pages sys_move_pages compat_sys_move_pages 332 332 318 i386 getcpu sys_getcpu 333 333 319 i386 epoll_pwait sys_epoll_pwait ··· 358 358 344 i386 syncfs sys_syncfs 359 359 345 i386 sendmmsg sys_sendmmsg compat_sys_sendmmsg 360 360 346 i386 setns sys_setns 361 - 347 i386 process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 362 - 348 i386 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 361 + 347 i386 process_vm_readv sys_process_vm_readv 362 + 348 i386 process_vm_writev sys_process_vm_writev 363 363 349 i386 kcmp sys_kcmp 364 364 350 i386 finit_module sys_finit_module 365 365 351 i386 sched_setattr sys_sched_setattr
+5 -5
arch/x86/entry/syscalls/syscall_64.tbl
··· 371 371 512 x32 rt_sigaction compat_sys_rt_sigaction 372 372 513 x32 rt_sigreturn compat_sys_x32_rt_sigreturn 373 373 514 x32 ioctl compat_sys_ioctl 374 - 515 x32 readv compat_sys_readv 375 - 516 x32 writev compat_sys_writev 374 + 515 x32 readv sys_readv 375 + 516 x32 writev sys_writev 376 376 517 x32 recvfrom compat_sys_recvfrom 377 377 518 x32 sendmsg compat_sys_sendmsg 378 378 519 x32 recvmsg compat_sys_recvmsg ··· 388 388 529 x32 waitid compat_sys_waitid 389 389 530 x32 set_robust_list compat_sys_set_robust_list 390 390 531 x32 get_robust_list compat_sys_get_robust_list 391 - 532 x32 vmsplice compat_sys_vmsplice 391 + 532 x32 vmsplice sys_vmsplice 392 392 533 x32 move_pages compat_sys_move_pages 393 393 534 x32 preadv compat_sys_preadv64 394 394 535 x32 pwritev compat_sys_pwritev64 395 395 536 x32 rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo 396 396 537 x32 recvmmsg compat_sys_recvmmsg_time64 397 397 538 x32 sendmmsg compat_sys_sendmmsg 398 - 539 x32 process_vm_readv compat_sys_process_vm_readv 399 - 540 x32 process_vm_writev compat_sys_process_vm_writev 398 + 539 x32 process_vm_readv sys_process_vm_readv 399 + 540 x32 process_vm_writev sys_process_vm_writev 400 400 541 x32 setsockopt sys_setsockopt 401 401 542 x32 getsockopt sys_getsockopt 402 402 543 x32 io_setup compat_sys_io_setup
+2 -10
block/scsi_ioctl.c
··· 333 333 struct iov_iter i; 334 334 struct iovec *iov = NULL; 335 335 336 - #ifdef CONFIG_COMPAT 337 - if (in_compat_syscall()) 338 - ret = compat_import_iovec(rq_data_dir(rq), 339 - hdr->dxferp, hdr->iovec_count, 340 - 0, &iov, &i); 341 - else 342 - #endif 343 - ret = import_iovec(rq_data_dir(rq), 344 - hdr->dxferp, hdr->iovec_count, 345 - 0, &iov, &i); 336 + ret = import_iovec(rq_data_dir(rq), hdr->dxferp, 337 + hdr->iovec_count, 0, &iov, &i); 346 338 if (ret < 0) 347 339 goto out_free_cdb; 348 340
+1 -8
drivers/scsi/sg.c
··· 1820 1820 struct iovec *iov = NULL; 1821 1821 struct iov_iter i; 1822 1822 1823 - #ifdef CONFIG_COMPAT 1824 - if (in_compat_syscall()) 1825 - res = compat_import_iovec(rw, hp->dxferp, iov_count, 1826 - 0, &iov, &i); 1827 - else 1828 - #endif 1829 - res = import_iovec(rw, hp->dxferp, iov_count, 1830 - 0, &iov, &i); 1823 + res = import_iovec(rw, hp->dxferp, iov_count, 0, &iov, &i); 1831 1824 if (res < 0) 1832 1825 return res; 1833 1826
+2 -6
fs/aio.c
··· 1489 1489 *iovec = NULL; 1490 1490 return ret; 1491 1491 } 1492 - #ifdef CONFIG_COMPAT 1493 - if (compat) 1494 - return compat_import_iovec(rw, buf, len, UIO_FASTIOV, iovec, 1495 - iter); 1496 - #endif 1497 - return import_iovec(rw, buf, len, UIO_FASTIOV, iovec, iter); 1492 + 1493 + return __import_iovec(rw, buf, len, UIO_FASTIOV, iovec, iter, compat); 1498 1494 } 1499 1495 1500 1496 static inline void aio_rw_done(struct kiocb *req, ssize_t ret)
+8 -12
fs/io_uring.c
··· 2852 2852 return ret; 2853 2853 } 2854 2854 2855 - #ifdef CONFIG_COMPAT 2856 - if (req->ctx->compat) 2857 - return compat_import_iovec(rw, buf, sqe_len, UIO_FASTIOV, 2858 - iovec, iter); 2859 - #endif 2860 - 2861 - return import_iovec(rw, buf, sqe_len, UIO_FASTIOV, iovec, iter); 2855 + return __import_iovec(rw, buf, sqe_len, UIO_FASTIOV, iovec, iter, 2856 + req->ctx->compat); 2862 2857 } 2863 2858 2864 2859 static ssize_t io_import_iovec(int rw, struct io_kiocb *req, ··· 4195 4200 sr->len); 4196 4201 iomsg->iov = NULL; 4197 4202 } else { 4198 - ret = import_iovec(READ, uiov, iov_len, UIO_FASTIOV, 4199 - &iomsg->iov, &iomsg->msg.msg_iter); 4203 + ret = __import_iovec(READ, uiov, iov_len, UIO_FASTIOV, 4204 + &iomsg->iov, &iomsg->msg.msg_iter, 4205 + false); 4200 4206 if (ret > 0) 4201 4207 ret = 0; 4202 4208 } ··· 4237 4241 sr->len = iomsg->iov[0].iov_len; 4238 4242 iomsg->iov = NULL; 4239 4243 } else { 4240 - ret = compat_import_iovec(READ, uiov, len, UIO_FASTIOV, 4241 - &iomsg->iov, 4242 - &iomsg->msg.msg_iter); 4244 + ret = __import_iovec(READ, (struct iovec __user *)uiov, len, 4245 + UIO_FASTIOV, &iomsg->iov, 4246 + &iomsg->msg.msg_iter, true); 4243 4247 if (ret < 0) 4244 4248 return ret; 4245 4249 }
+26 -336
fs/read_write.c
··· 760 760 return ret; 761 761 } 762 762 763 - /** 764 - * rw_copy_check_uvector() - Copy an array of &struct iovec from userspace 765 - * into the kernel and check that it is valid. 766 - * 767 - * @type: One of %CHECK_IOVEC_ONLY, %READ, or %WRITE. 768 - * @uvector: Pointer to the userspace array. 769 - * @nr_segs: Number of elements in userspace array. 770 - * @fast_segs: Number of elements in @fast_pointer. 771 - * @fast_pointer: Pointer to (usually small on-stack) kernel array. 772 - * @ret_pointer: (output parameter) Pointer to a variable that will point to 773 - * either @fast_pointer, a newly allocated kernel array, or NULL, 774 - * depending on which array was used. 775 - * 776 - * This function copies an array of &struct iovec of @nr_segs from 777 - * userspace into the kernel and checks that each element is valid (e.g. 778 - * it does not point to a kernel address or cause overflow by being too 779 - * large, etc.). 780 - * 781 - * As an optimization, the caller may provide a pointer to a small 782 - * on-stack array in @fast_pointer, typically %UIO_FASTIOV elements long 783 - * (the size of this array, or 0 if unused, should be given in @fast_segs). 784 - * 785 - * @ret_pointer will always point to the array that was used, so the 786 - * caller must take care not to call kfree() on it e.g. in case the 787 - * @fast_pointer array was used and it was allocated on the stack. 788 - * 789 - * Return: The total number of bytes covered by the iovec array on success 790 - * or a negative error code on error. 791 - */ 792 - ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, 793 - unsigned long nr_segs, unsigned long fast_segs, 794 - struct iovec *fast_pointer, 795 - struct iovec **ret_pointer) 796 - { 797 - unsigned long seg; 798 - ssize_t ret; 799 - struct iovec *iov = fast_pointer; 800 - 801 - /* 802 - * SuS says "The readv() function *may* fail if the iovcnt argument 803 - * was less than or equal to 0, or greater than {IOV_MAX}. Linux has 804 - * traditionally returned zero for zero segments, so... 805 - */ 806 - if (nr_segs == 0) { 807 - ret = 0; 808 - goto out; 809 - } 810 - 811 - /* 812 - * First get the "struct iovec" from user memory and 813 - * verify all the pointers 814 - */ 815 - if (nr_segs > UIO_MAXIOV) { 816 - ret = -EINVAL; 817 - goto out; 818 - } 819 - if (nr_segs > fast_segs) { 820 - iov = kmalloc_array(nr_segs, sizeof(struct iovec), GFP_KERNEL); 821 - if (iov == NULL) { 822 - ret = -ENOMEM; 823 - goto out; 824 - } 825 - } 826 - if (copy_from_user(iov, uvector, nr_segs*sizeof(*uvector))) { 827 - ret = -EFAULT; 828 - goto out; 829 - } 830 - 831 - /* 832 - * According to the Single Unix Specification we should return EINVAL 833 - * if an element length is < 0 when cast to ssize_t or if the 834 - * total length would overflow the ssize_t return value of the 835 - * system call. 836 - * 837 - * Linux caps all read/write calls to MAX_RW_COUNT, and avoids the 838 - * overflow case. 839 - */ 840 - ret = 0; 841 - for (seg = 0; seg < nr_segs; seg++) { 842 - void __user *buf = iov[seg].iov_base; 843 - ssize_t len = (ssize_t)iov[seg].iov_len; 844 - 845 - /* see if we we're about to use an invalid len or if 846 - * it's about to overflow ssize_t */ 847 - if (len < 0) { 848 - ret = -EINVAL; 849 - goto out; 850 - } 851 - if (type >= 0 852 - && unlikely(!access_ok(buf, len))) { 853 - ret = -EFAULT; 854 - goto out; 855 - } 856 - if (len > MAX_RW_COUNT - ret) { 857 - len = MAX_RW_COUNT - ret; 858 - iov[seg].iov_len = len; 859 - } 860 - ret += len; 861 - } 862 - out: 863 - *ret_pointer = iov; 864 - return ret; 865 - } 866 - 867 - #ifdef CONFIG_COMPAT 868 - ssize_t compat_rw_copy_check_uvector(int type, 869 - const struct compat_iovec __user *uvector, unsigned long nr_segs, 870 - unsigned long fast_segs, struct iovec *fast_pointer, 871 - struct iovec **ret_pointer) 872 - { 873 - compat_ssize_t tot_len; 874 - struct iovec *iov = *ret_pointer = fast_pointer; 875 - ssize_t ret = 0; 876 - int seg; 877 - 878 - /* 879 - * SuS says "The readv() function *may* fail if the iovcnt argument 880 - * was less than or equal to 0, or greater than {IOV_MAX}. Linux has 881 - * traditionally returned zero for zero segments, so... 882 - */ 883 - if (nr_segs == 0) 884 - goto out; 885 - 886 - ret = -EINVAL; 887 - if (nr_segs > UIO_MAXIOV) 888 - goto out; 889 - if (nr_segs > fast_segs) { 890 - ret = -ENOMEM; 891 - iov = kmalloc_array(nr_segs, sizeof(struct iovec), GFP_KERNEL); 892 - if (iov == NULL) 893 - goto out; 894 - } 895 - *ret_pointer = iov; 896 - 897 - ret = -EFAULT; 898 - if (!access_ok(uvector, nr_segs*sizeof(*uvector))) 899 - goto out; 900 - 901 - /* 902 - * Single unix specification: 903 - * We should -EINVAL if an element length is not >= 0 and fitting an 904 - * ssize_t. 905 - * 906 - * In Linux, the total length is limited to MAX_RW_COUNT, there is 907 - * no overflow possibility. 908 - */ 909 - tot_len = 0; 910 - ret = -EINVAL; 911 - for (seg = 0; seg < nr_segs; seg++) { 912 - compat_uptr_t buf; 913 - compat_ssize_t len; 914 - 915 - if (__get_user(len, &uvector->iov_len) || 916 - __get_user(buf, &uvector->iov_base)) { 917 - ret = -EFAULT; 918 - goto out; 919 - } 920 - if (len < 0) /* size_t not fitting in compat_ssize_t .. */ 921 - goto out; 922 - if (type >= 0 && 923 - !access_ok(compat_ptr(buf), len)) { 924 - ret = -EFAULT; 925 - goto out; 926 - } 927 - if (len > MAX_RW_COUNT - tot_len) 928 - len = MAX_RW_COUNT - tot_len; 929 - tot_len += len; 930 - iov->iov_base = compat_ptr(buf); 931 - iov->iov_len = (compat_size_t) len; 932 - uvector++; 933 - iov++; 934 - } 935 - ret = tot_len; 936 - 937 - out: 938 - return ret; 939 - } 940 - #endif 941 - 942 763 static ssize_t do_iter_read(struct file *file, struct iov_iter *iter, 943 764 loff_t *pos, rwf_t flags) 944 765 { ··· 1076 1255 return do_pwritev(fd, vec, vlen, pos, flags); 1077 1256 } 1078 1257 1258 + /* 1259 + * Various compat syscalls. Note that they all pretend to take a native 1260 + * iovec - import_iovec will properly treat those as compat_iovecs based on 1261 + * in_compat_syscall(). 1262 + */ 1079 1263 #ifdef CONFIG_COMPAT 1080 - static size_t compat_readv(struct file *file, 1081 - const struct compat_iovec __user *vec, 1082 - unsigned long vlen, loff_t *pos, rwf_t flags) 1083 - { 1084 - struct iovec iovstack[UIO_FASTIOV]; 1085 - struct iovec *iov = iovstack; 1086 - struct iov_iter iter; 1087 - ssize_t ret; 1088 - 1089 - ret = compat_import_iovec(READ, vec, vlen, UIO_FASTIOV, &iov, &iter); 1090 - if (ret >= 0) { 1091 - ret = do_iter_read(file, &iter, pos, flags); 1092 - kfree(iov); 1093 - } 1094 - if (ret > 0) 1095 - add_rchar(current, ret); 1096 - inc_syscr(current); 1097 - return ret; 1098 - } 1099 - 1100 - static size_t do_compat_readv(compat_ulong_t fd, 1101 - const struct compat_iovec __user *vec, 1102 - compat_ulong_t vlen, rwf_t flags) 1103 - { 1104 - struct fd f = fdget_pos(fd); 1105 - ssize_t ret; 1106 - loff_t pos; 1107 - 1108 - if (!f.file) 1109 - return -EBADF; 1110 - pos = f.file->f_pos; 1111 - ret = compat_readv(f.file, vec, vlen, &pos, flags); 1112 - if (ret >= 0) 1113 - f.file->f_pos = pos; 1114 - fdput_pos(f); 1115 - return ret; 1116 - 1117 - } 1118 - 1119 - COMPAT_SYSCALL_DEFINE3(readv, compat_ulong_t, fd, 1120 - const struct compat_iovec __user *,vec, 1121 - compat_ulong_t, vlen) 1122 - { 1123 - return do_compat_readv(fd, vec, vlen, 0); 1124 - } 1125 - 1126 - static long do_compat_preadv64(unsigned long fd, 1127 - const struct compat_iovec __user *vec, 1128 - unsigned long vlen, loff_t pos, rwf_t flags) 1129 - { 1130 - struct fd f; 1131 - ssize_t ret; 1132 - 1133 - if (pos < 0) 1134 - return -EINVAL; 1135 - f = fdget(fd); 1136 - if (!f.file) 1137 - return -EBADF; 1138 - ret = -ESPIPE; 1139 - if (f.file->f_mode & FMODE_PREAD) 1140 - ret = compat_readv(f.file, vec, vlen, &pos, flags); 1141 - fdput(f); 1142 - return ret; 1143 - } 1144 - 1145 1264 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64 1146 1265 COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd, 1147 - const struct compat_iovec __user *,vec, 1266 + const struct iovec __user *, vec, 1148 1267 unsigned long, vlen, loff_t, pos) 1149 1268 { 1150 - return do_compat_preadv64(fd, vec, vlen, pos, 0); 1269 + return do_preadv(fd, vec, vlen, pos, 0); 1151 1270 } 1152 1271 #endif 1153 1272 1154 1273 COMPAT_SYSCALL_DEFINE5(preadv, compat_ulong_t, fd, 1155 - const struct compat_iovec __user *,vec, 1274 + const struct iovec __user *, vec, 1156 1275 compat_ulong_t, vlen, u32, pos_low, u32, pos_high) 1157 1276 { 1158 1277 loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1159 1278 1160 - return do_compat_preadv64(fd, vec, vlen, pos, 0); 1279 + return do_preadv(fd, vec, vlen, pos, 0); 1161 1280 } 1162 1281 1163 1282 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2 1164 1283 COMPAT_SYSCALL_DEFINE5(preadv64v2, unsigned long, fd, 1165 - const struct compat_iovec __user *,vec, 1284 + const struct iovec __user *, vec, 1166 1285 unsigned long, vlen, loff_t, pos, rwf_t, flags) 1167 1286 { 1168 1287 if (pos == -1) 1169 - return do_compat_readv(fd, vec, vlen, flags); 1170 - 1171 - return do_compat_preadv64(fd, vec, vlen, pos, flags); 1288 + return do_readv(fd, vec, vlen, flags); 1289 + return do_preadv(fd, vec, vlen, pos, flags); 1172 1290 } 1173 1291 #endif 1174 1292 1175 1293 COMPAT_SYSCALL_DEFINE6(preadv2, compat_ulong_t, fd, 1176 - const struct compat_iovec __user *,vec, 1294 + const struct iovec __user *, vec, 1177 1295 compat_ulong_t, vlen, u32, pos_low, u32, pos_high, 1178 1296 rwf_t, flags) 1179 1297 { 1180 1298 loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1181 1299 1182 1300 if (pos == -1) 1183 - return do_compat_readv(fd, vec, vlen, flags); 1184 - 1185 - return do_compat_preadv64(fd, vec, vlen, pos, flags); 1186 - } 1187 - 1188 - static size_t compat_writev(struct file *file, 1189 - const struct compat_iovec __user *vec, 1190 - unsigned long vlen, loff_t *pos, rwf_t flags) 1191 - { 1192 - struct iovec iovstack[UIO_FASTIOV]; 1193 - struct iovec *iov = iovstack; 1194 - struct iov_iter iter; 1195 - ssize_t ret; 1196 - 1197 - ret = compat_import_iovec(WRITE, vec, vlen, UIO_FASTIOV, &iov, &iter); 1198 - if (ret >= 0) { 1199 - file_start_write(file); 1200 - ret = do_iter_write(file, &iter, pos, flags); 1201 - file_end_write(file); 1202 - kfree(iov); 1203 - } 1204 - if (ret > 0) 1205 - add_wchar(current, ret); 1206 - inc_syscw(current); 1207 - return ret; 1208 - } 1209 - 1210 - static size_t do_compat_writev(compat_ulong_t fd, 1211 - const struct compat_iovec __user* vec, 1212 - compat_ulong_t vlen, rwf_t flags) 1213 - { 1214 - struct fd f = fdget_pos(fd); 1215 - ssize_t ret; 1216 - loff_t pos; 1217 - 1218 - if (!f.file) 1219 - return -EBADF; 1220 - pos = f.file->f_pos; 1221 - ret = compat_writev(f.file, vec, vlen, &pos, flags); 1222 - if (ret >= 0) 1223 - f.file->f_pos = pos; 1224 - fdput_pos(f); 1225 - return ret; 1226 - } 1227 - 1228 - COMPAT_SYSCALL_DEFINE3(writev, compat_ulong_t, fd, 1229 - const struct compat_iovec __user *, vec, 1230 - compat_ulong_t, vlen) 1231 - { 1232 - return do_compat_writev(fd, vec, vlen, 0); 1233 - } 1234 - 1235 - static long do_compat_pwritev64(unsigned long fd, 1236 - const struct compat_iovec __user *vec, 1237 - unsigned long vlen, loff_t pos, rwf_t flags) 1238 - { 1239 - struct fd f; 1240 - ssize_t ret; 1241 - 1242 - if (pos < 0) 1243 - return -EINVAL; 1244 - f = fdget(fd); 1245 - if (!f.file) 1246 - return -EBADF; 1247 - ret = -ESPIPE; 1248 - if (f.file->f_mode & FMODE_PWRITE) 1249 - ret = compat_writev(f.file, vec, vlen, &pos, flags); 1250 - fdput(f); 1251 - return ret; 1301 + return do_readv(fd, vec, vlen, flags); 1302 + return do_preadv(fd, vec, vlen, pos, flags); 1252 1303 } 1253 1304 1254 1305 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64 1255 1306 COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd, 1256 - const struct compat_iovec __user *,vec, 1307 + const struct iovec __user *, vec, 1257 1308 unsigned long, vlen, loff_t, pos) 1258 1309 { 1259 - return do_compat_pwritev64(fd, vec, vlen, pos, 0); 1310 + return do_pwritev(fd, vec, vlen, pos, 0); 1260 1311 } 1261 1312 #endif 1262 1313 1263 1314 COMPAT_SYSCALL_DEFINE5(pwritev, compat_ulong_t, fd, 1264 - const struct compat_iovec __user *,vec, 1315 + const struct iovec __user *,vec, 1265 1316 compat_ulong_t, vlen, u32, pos_low, u32, pos_high) 1266 1317 { 1267 1318 loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1268 1319 1269 - return do_compat_pwritev64(fd, vec, vlen, pos, 0); 1320 + return do_pwritev(fd, vec, vlen, pos, 0); 1270 1321 } 1271 1322 1272 1323 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2 1273 1324 COMPAT_SYSCALL_DEFINE5(pwritev64v2, unsigned long, fd, 1274 - const struct compat_iovec __user *,vec, 1325 + const struct iovec __user *, vec, 1275 1326 unsigned long, vlen, loff_t, pos, rwf_t, flags) 1276 1327 { 1277 1328 if (pos == -1) 1278 - return do_compat_writev(fd, vec, vlen, flags); 1279 - 1280 - return do_compat_pwritev64(fd, vec, vlen, pos, flags); 1329 + return do_writev(fd, vec, vlen, flags); 1330 + return do_pwritev(fd, vec, vlen, pos, flags); 1281 1331 } 1282 1332 #endif 1283 1333 1284 1334 COMPAT_SYSCALL_DEFINE6(pwritev2, compat_ulong_t, fd, 1285 - const struct compat_iovec __user *,vec, 1335 + const struct iovec __user *,vec, 1286 1336 compat_ulong_t, vlen, u32, pos_low, u32, pos_high, rwf_t, flags) 1287 1337 { 1288 1338 loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1289 1339 1290 1340 if (pos == -1) 1291 - return do_compat_writev(fd, vec, vlen, flags); 1292 - 1293 - return do_compat_pwritev64(fd, vec, vlen, pos, flags); 1341 + return do_writev(fd, vec, vlen, flags); 1342 + return do_pwritev(fd, vec, vlen, pos, flags); 1294 1343 } 1295 - 1296 - #endif 1344 + #endif /* CONFIG_COMPAT */ 1297 1345 1298 1346 static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, 1299 1347 size_t count, loff_t max)
+15 -46
fs/splice.c
··· 33 33 #include <linux/security.h> 34 34 #include <linux/gfp.h> 35 35 #include <linux/socket.h> 36 - #include <linux/compat.h> 37 36 #include <linux/sched/signal.h> 38 37 39 38 #include "internal.h" ··· 1351 1352 * Currently we punt and implement it as a normal copy, see pipe_to_user(). 1352 1353 * 1353 1354 */ 1354 - static long do_vmsplice(struct file *f, struct iov_iter *iter, unsigned int flags) 1355 - { 1356 - if (unlikely(flags & ~SPLICE_F_ALL)) 1357 - return -EINVAL; 1358 - 1359 - if (!iov_iter_count(iter)) 1360 - return 0; 1361 - 1362 - if (iov_iter_rw(iter) == WRITE) 1363 - return vmsplice_to_pipe(f, iter, flags); 1364 - else 1365 - return vmsplice_to_user(f, iter, flags); 1366 - } 1367 - 1368 1355 SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, uiov, 1369 1356 unsigned long, nr_segs, unsigned int, flags) 1370 1357 { ··· 1361 1376 struct fd f; 1362 1377 int type; 1363 1378 1379 + if (unlikely(flags & ~SPLICE_F_ALL)) 1380 + return -EINVAL; 1381 + 1364 1382 f = fdget(fd); 1365 1383 error = vmsplice_type(f, &type); 1366 1384 if (error) ··· 1371 1383 1372 1384 error = import_iovec(type, uiov, nr_segs, 1373 1385 ARRAY_SIZE(iovstack), &iov, &iter); 1374 - if (error >= 0) { 1375 - error = do_vmsplice(f.file, &iter, flags); 1376 - kfree(iov); 1377 - } 1386 + if (error < 0) 1387 + goto out_fdput; 1388 + 1389 + if (!iov_iter_count(&iter)) 1390 + error = 0; 1391 + else if (iov_iter_rw(&iter) == WRITE) 1392 + error = vmsplice_to_pipe(f.file, &iter, flags); 1393 + else 1394 + error = vmsplice_to_user(f.file, &iter, flags); 1395 + 1396 + kfree(iov); 1397 + out_fdput: 1378 1398 fdput(f); 1379 1399 return error; 1380 1400 } 1381 - 1382 - #ifdef CONFIG_COMPAT 1383 - COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32, 1384 - unsigned int, nr_segs, unsigned int, flags) 1385 - { 1386 - struct iovec iovstack[UIO_FASTIOV]; 1387 - struct iovec *iov = iovstack; 1388 - struct iov_iter iter; 1389 - ssize_t error; 1390 - struct fd f; 1391 - int type; 1392 - 1393 - f = fdget(fd); 1394 - error = vmsplice_type(f, &type); 1395 - if (error) 1396 - return error; 1397 - 1398 - error = compat_import_iovec(type, iov32, nr_segs, 1399 - ARRAY_SIZE(iovstack), &iov, &iter); 1400 - if (error >= 0) { 1401 - error = do_vmsplice(f.file, &iter, flags); 1402 - kfree(iov); 1403 - } 1404 - fdput(f); 1405 - return error; 1406 - } 1407 - #endif 1408 1401 1409 1402 SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in, 1410 1403 int, fd_out, loff_t __user *, off_out,
+14 -36
include/linux/compat.h
··· 91 91 static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) 92 92 #endif /* COMPAT_SYSCALL_DEFINEx */ 93 93 94 + struct compat_iovec { 95 + compat_uptr_t iov_base; 96 + compat_size_t iov_len; 97 + }; 98 + 94 99 #ifdef CONFIG_COMPAT 95 100 96 101 #ifndef compat_user_stack_pointer ··· 252 247 } _sigsys; 253 248 } _sifields; 254 249 } compat_siginfo_t; 255 - 256 - struct compat_iovec { 257 - compat_uptr_t iov_base; 258 - compat_size_t iov_len; 259 - }; 260 250 261 251 struct compat_rlimit { 262 252 compat_ulong_t rlim_cur; ··· 451 451 452 452 struct epoll_event; /* fortunately, this one is fixed-layout */ 453 453 454 - extern ssize_t compat_rw_copy_check_uvector(int type, 455 - const struct compat_iovec __user *uvector, 456 - unsigned long nr_segs, 457 - unsigned long fast_segs, struct iovec *fast_pointer, 458 - struct iovec **ret_pointer); 459 - 460 454 extern void __user *compat_alloc_user_space(unsigned long len); 461 455 462 456 int compat_restore_altstack(const compat_stack_t __user *uss); ··· 545 551 546 552 /* fs/read_write.c */ 547 553 asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int); 548 - asmlinkage ssize_t compat_sys_readv(compat_ulong_t fd, 549 - const struct compat_iovec __user *vec, compat_ulong_t vlen); 550 - asmlinkage ssize_t compat_sys_writev(compat_ulong_t fd, 551 - const struct compat_iovec __user *vec, compat_ulong_t vlen); 552 554 /* No generic prototype for pread64 and pwrite64 */ 553 555 asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd, 554 - const struct compat_iovec __user *vec, 556 + const struct iovec __user *vec, 555 557 compat_ulong_t vlen, u32 pos_low, u32 pos_high); 556 558 asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd, 557 - const struct compat_iovec __user *vec, 559 + const struct iovec __user *vec, 558 560 compat_ulong_t vlen, u32 pos_low, u32 pos_high); 559 561 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64 560 562 asmlinkage long compat_sys_preadv64(unsigned long fd, 561 - const struct compat_iovec __user *vec, 563 + const struct iovec __user *vec, 562 564 unsigned long vlen, loff_t pos); 563 565 #endif 564 566 565 567 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64 566 568 asmlinkage long compat_sys_pwritev64(unsigned long fd, 567 - const struct compat_iovec __user *vec, 569 + const struct iovec __user *vec, 568 570 unsigned long vlen, loff_t pos); 569 571 #endif 570 572 ··· 596 606 asmlinkage long compat_sys_signalfd4(int ufd, 597 607 const compat_sigset_t __user *sigmask, 598 608 compat_size_t sigsetsize, int flags); 599 - 600 - /* fs/splice.c */ 601 - asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *, 602 - unsigned int nr_segs, unsigned int flags); 603 609 604 610 /* fs/stat.c */ 605 611 asmlinkage long compat_sys_newfstatat(unsigned int dfd, ··· 780 794 int flags); 781 795 asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, 782 796 unsigned vlen, unsigned int flags); 783 - asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid, 784 - const struct compat_iovec __user *lvec, 785 - compat_ulong_t liovcnt, const struct compat_iovec __user *rvec, 786 - compat_ulong_t riovcnt, compat_ulong_t flags); 787 - asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid, 788 - const struct compat_iovec __user *lvec, 789 - compat_ulong_t liovcnt, const struct compat_iovec __user *rvec, 790 - compat_ulong_t riovcnt, compat_ulong_t flags); 791 797 asmlinkage long compat_sys_execveat(int dfd, const char __user *filename, 792 798 const compat_uptr_t __user *argv, 793 799 const compat_uptr_t __user *envp, int flags); 794 800 asmlinkage ssize_t compat_sys_preadv2(compat_ulong_t fd, 795 - const struct compat_iovec __user *vec, 801 + const struct iovec __user *vec, 796 802 compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags); 797 803 asmlinkage ssize_t compat_sys_pwritev2(compat_ulong_t fd, 798 - const struct compat_iovec __user *vec, 804 + const struct iovec __user *vec, 799 805 compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags); 800 806 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2 801 - asmlinkage long compat_sys_readv64v2(unsigned long fd, 802 - const struct compat_iovec __user *vec, 807 + asmlinkage long compat_sys_preadv64v2(unsigned long fd, 808 + const struct iovec __user *vec, 803 809 unsigned long vlen, loff_t pos, rwf_t flags); 804 810 #endif 805 811 806 812 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2 807 813 asmlinkage long compat_sys_pwritev64v2(unsigned long fd, 808 - const struct compat_iovec __user *vec, 814 + const struct iovec __user *vec, 809 815 unsigned long vlen, loff_t pos, rwf_t flags); 810 816 #endif 811 817
-13
include/linux/fs.h
··· 179 179 #define FMODE_BUF_RASYNC ((__force fmode_t)0x40000000) 180 180 181 181 /* 182 - * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector 183 - * that indicates that they should check the contents of the iovec are 184 - * valid, but not check the memory that the iovec elements 185 - * points too. 186 - */ 187 - #define CHECK_IOVEC_ONLY -1 188 - 189 - /* 190 182 * Attribute flags. These should be or-ed together to figure out what 191 183 * has been changed! 192 184 */ ··· 1878 1886 { 1879 1887 return file->f_op->mmap(file, vma); 1880 1888 } 1881 - 1882 - ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, 1883 - unsigned long nr_segs, unsigned long fast_segs, 1884 - struct iovec *fast_pointer, 1885 - struct iovec **ret_pointer); 1886 1889 1887 1890 extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); 1888 1891 extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
+9 -11
include/linux/uio.h
··· 266 266 size_t hash_and_copy_to_iter(const void *addr, size_t bytes, void *hashp, 267 267 struct iov_iter *i); 268 268 269 - ssize_t import_iovec(int type, const struct iovec __user * uvector, 270 - unsigned nr_segs, unsigned fast_segs, 271 - struct iovec **iov, struct iov_iter *i); 272 - 273 - #ifdef CONFIG_COMPAT 274 - struct compat_iovec; 275 - ssize_t compat_import_iovec(int type, const struct compat_iovec __user * uvector, 276 - unsigned nr_segs, unsigned fast_segs, 277 - struct iovec **iov, struct iov_iter *i); 278 - #endif 279 - 269 + struct iovec *iovec_from_user(const struct iovec __user *uvector, 270 + unsigned long nr_segs, unsigned long fast_segs, 271 + struct iovec *fast_iov, bool compat); 272 + ssize_t import_iovec(int type, const struct iovec __user *uvec, 273 + unsigned nr_segs, unsigned fast_segs, struct iovec **iovp, 274 + struct iov_iter *i); 275 + ssize_t __import_iovec(int type, const struct iovec __user *uvec, 276 + unsigned nr_segs, unsigned fast_segs, struct iovec **iovp, 277 + struct iov_iter *i, bool compat); 280 278 int import_single_range(int type, void __user *buf, size_t len, 281 279 struct iovec *iov, struct iov_iter *i); 282 280
+5 -7
include/uapi/asm-generic/unistd.h
··· 207 207 #define __NR_write 64 208 208 __SYSCALL(__NR_write, sys_write) 209 209 #define __NR_readv 65 210 - __SC_COMP(__NR_readv, sys_readv, compat_sys_readv) 210 + __SC_COMP(__NR_readv, sys_readv, sys_readv) 211 211 #define __NR_writev 66 212 - __SC_COMP(__NR_writev, sys_writev, compat_sys_writev) 212 + __SC_COMP(__NR_writev, sys_writev, sys_writev) 213 213 #define __NR_pread64 67 214 214 __SC_COMP(__NR_pread64, sys_pread64, compat_sys_pread64) 215 215 #define __NR_pwrite64 68 ··· 237 237 238 238 /* fs/splice.c */ 239 239 #define __NR_vmsplice 75 240 - __SC_COMP(__NR_vmsplice, sys_vmsplice, compat_sys_vmsplice) 240 + __SYSCALL(__NR_vmsplice, sys_vmsplice) 241 241 #define __NR_splice 76 242 242 __SYSCALL(__NR_splice, sys_splice) 243 243 #define __NR_tee 77 ··· 727 727 #define __NR_sendmmsg 269 728 728 __SC_COMP(__NR_sendmmsg, sys_sendmmsg, compat_sys_sendmmsg) 729 729 #define __NR_process_vm_readv 270 730 - __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \ 731 - compat_sys_process_vm_readv) 730 + __SYSCALL(__NR_process_vm_readv, sys_process_vm_readv) 732 731 #define __NR_process_vm_writev 271 733 - __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ 734 - compat_sys_process_vm_writev) 732 + __SYSCALL(__NR_process_vm_writev, sys_process_vm_writev) 735 733 #define __NR_kcmp 272 736 734 __SYSCALL(__NR_kcmp, sys_kcmp) 737 735 #define __NR_finit_module 273
+136 -42
lib/iov_iter.c
··· 7 7 #include <linux/slab.h> 8 8 #include <linux/vmalloc.h> 9 9 #include <linux/splice.h> 10 + #include <linux/compat.h> 10 11 #include <net/checksum.h> 11 12 #include <linux/scatterlist.h> 12 13 #include <linux/instrumented.h> ··· 1646 1645 } 1647 1646 EXPORT_SYMBOL(dup_iter); 1648 1647 1648 + static int copy_compat_iovec_from_user(struct iovec *iov, 1649 + const struct iovec __user *uvec, unsigned long nr_segs) 1650 + { 1651 + const struct compat_iovec __user *uiov = 1652 + (const struct compat_iovec __user *)uvec; 1653 + int ret = -EFAULT, i; 1654 + 1655 + if (!user_access_begin(uvec, nr_segs * sizeof(*uvec))) 1656 + return -EFAULT; 1657 + 1658 + for (i = 0; i < nr_segs; i++) { 1659 + compat_uptr_t buf; 1660 + compat_ssize_t len; 1661 + 1662 + unsafe_get_user(len, &uiov[i].iov_len, uaccess_end); 1663 + unsafe_get_user(buf, &uiov[i].iov_base, uaccess_end); 1664 + 1665 + /* check for compat_size_t not fitting in compat_ssize_t .. */ 1666 + if (len < 0) { 1667 + ret = -EINVAL; 1668 + goto uaccess_end; 1669 + } 1670 + iov[i].iov_base = compat_ptr(buf); 1671 + iov[i].iov_len = len; 1672 + } 1673 + 1674 + ret = 0; 1675 + uaccess_end: 1676 + user_access_end(); 1677 + return ret; 1678 + } 1679 + 1680 + static int copy_iovec_from_user(struct iovec *iov, 1681 + const struct iovec __user *uvec, unsigned long nr_segs) 1682 + { 1683 + unsigned long seg; 1684 + 1685 + if (copy_from_user(iov, uvec, nr_segs * sizeof(*uvec))) 1686 + return -EFAULT; 1687 + for (seg = 0; seg < nr_segs; seg++) { 1688 + if ((ssize_t)iov[seg].iov_len < 0) 1689 + return -EINVAL; 1690 + } 1691 + 1692 + return 0; 1693 + } 1694 + 1695 + struct iovec *iovec_from_user(const struct iovec __user *uvec, 1696 + unsigned long nr_segs, unsigned long fast_segs, 1697 + struct iovec *fast_iov, bool compat) 1698 + { 1699 + struct iovec *iov = fast_iov; 1700 + int ret; 1701 + 1702 + /* 1703 + * SuS says "The readv() function *may* fail if the iovcnt argument was 1704 + * less than or equal to 0, or greater than {IOV_MAX}. Linux has 1705 + * traditionally returned zero for zero segments, so... 1706 + */ 1707 + if (nr_segs == 0) 1708 + return iov; 1709 + if (nr_segs > UIO_MAXIOV) 1710 + return ERR_PTR(-EINVAL); 1711 + if (nr_segs > fast_segs) { 1712 + iov = kmalloc_array(nr_segs, sizeof(struct iovec), GFP_KERNEL); 1713 + if (!iov) 1714 + return ERR_PTR(-ENOMEM); 1715 + } 1716 + 1717 + if (compat) 1718 + ret = copy_compat_iovec_from_user(iov, uvec, nr_segs); 1719 + else 1720 + ret = copy_iovec_from_user(iov, uvec, nr_segs); 1721 + if (ret) { 1722 + if (iov != fast_iov) 1723 + kfree(iov); 1724 + return ERR_PTR(ret); 1725 + } 1726 + 1727 + return iov; 1728 + } 1729 + 1730 + ssize_t __import_iovec(int type, const struct iovec __user *uvec, 1731 + unsigned nr_segs, unsigned fast_segs, struct iovec **iovp, 1732 + struct iov_iter *i, bool compat) 1733 + { 1734 + ssize_t total_len = 0; 1735 + unsigned long seg; 1736 + struct iovec *iov; 1737 + 1738 + iov = iovec_from_user(uvec, nr_segs, fast_segs, *iovp, compat); 1739 + if (IS_ERR(iov)) { 1740 + *iovp = NULL; 1741 + return PTR_ERR(iov); 1742 + } 1743 + 1744 + /* 1745 + * According to the Single Unix Specification we should return EINVAL if 1746 + * an element length is < 0 when cast to ssize_t or if the total length 1747 + * would overflow the ssize_t return value of the system call. 1748 + * 1749 + * Linux caps all read/write calls to MAX_RW_COUNT, and avoids the 1750 + * overflow case. 1751 + */ 1752 + for (seg = 0; seg < nr_segs; seg++) { 1753 + ssize_t len = (ssize_t)iov[seg].iov_len; 1754 + 1755 + if (!access_ok(iov[seg].iov_base, len)) { 1756 + if (iov != *iovp) 1757 + kfree(iov); 1758 + *iovp = NULL; 1759 + return -EFAULT; 1760 + } 1761 + 1762 + if (len > MAX_RW_COUNT - total_len) { 1763 + len = MAX_RW_COUNT - total_len; 1764 + iov[seg].iov_len = len; 1765 + } 1766 + total_len += len; 1767 + } 1768 + 1769 + iov_iter_init(i, type, iov, nr_segs, total_len); 1770 + if (iov == *iovp) 1771 + *iovp = NULL; 1772 + else 1773 + *iovp = iov; 1774 + return total_len; 1775 + } 1776 + 1649 1777 /** 1650 1778 * import_iovec() - Copy an array of &struct iovec from userspace 1651 1779 * into the kernel, check that it is valid, and initialize a new 1652 1780 * &struct iov_iter iterator to access it. 1653 1781 * 1654 1782 * @type: One of %READ or %WRITE. 1655 - * @uvector: Pointer to the userspace array. 1783 + * @uvec: Pointer to the userspace array. 1656 1784 * @nr_segs: Number of elements in userspace array. 1657 1785 * @fast_segs: Number of elements in @iov. 1658 - * @iov: (input and output parameter) Pointer to pointer to (usually small 1786 + * @iovp: (input and output parameter) Pointer to pointer to (usually small 1659 1787 * on-stack) kernel array. 1660 1788 * @i: Pointer to iterator that will be initialized on success. 1661 1789 * ··· 1797 1667 * 1798 1668 * Return: Negative error code on error, bytes imported on success 1799 1669 */ 1800 - ssize_t import_iovec(int type, const struct iovec __user * uvector, 1670 + ssize_t import_iovec(int type, const struct iovec __user *uvec, 1801 1671 unsigned nr_segs, unsigned fast_segs, 1802 - struct iovec **iov, struct iov_iter *i) 1672 + struct iovec **iovp, struct iov_iter *i) 1803 1673 { 1804 - ssize_t n; 1805 - struct iovec *p; 1806 - n = rw_copy_check_uvector(type, uvector, nr_segs, fast_segs, 1807 - *iov, &p); 1808 - if (n < 0) { 1809 - if (p != *iov) 1810 - kfree(p); 1811 - *iov = NULL; 1812 - return n; 1813 - } 1814 - iov_iter_init(i, type, p, nr_segs, n); 1815 - *iov = p == *iov ? NULL : p; 1816 - return n; 1674 + return __import_iovec(type, uvec, nr_segs, fast_segs, iovp, i, 1675 + in_compat_syscall()); 1817 1676 } 1818 1677 EXPORT_SYMBOL(import_iovec); 1819 - 1820 - #ifdef CONFIG_COMPAT 1821 - #include <linux/compat.h> 1822 - 1823 - ssize_t compat_import_iovec(int type, 1824 - const struct compat_iovec __user * uvector, 1825 - unsigned nr_segs, unsigned fast_segs, 1826 - struct iovec **iov, struct iov_iter *i) 1827 - { 1828 - ssize_t n; 1829 - struct iovec *p; 1830 - n = compat_rw_copy_check_uvector(type, uvector, nr_segs, fast_segs, 1831 - *iov, &p); 1832 - if (n < 0) { 1833 - if (p != *iov) 1834 - kfree(p); 1835 - *iov = NULL; 1836 - return n; 1837 - } 1838 - iov_iter_init(i, type, p, nr_segs, n); 1839 - *iov = p == *iov ? NULL : p; 1840 - return n; 1841 - } 1842 - EXPORT_SYMBOL(compat_import_iovec); 1843 - #endif 1844 1678 1845 1679 int import_single_range(int rw, void __user *buf, size_t len, 1846 1680 struct iovec *iov, struct iov_iter *i)
+7 -79
mm/process_vm_access.c
··· 14 14 #include <linux/slab.h> 15 15 #include <linux/syscalls.h> 16 16 17 - #ifdef CONFIG_COMPAT 18 - #include <linux/compat.h> 19 - #endif 20 - 21 17 /** 22 18 * process_vm_rw_pages - read/write pages from task specified 23 19 * @pages: array of pointers to pages we want to copy ··· 272 276 if (rc < 0) 273 277 return rc; 274 278 if (!iov_iter_count(&iter)) 275 - goto free_iovecs; 276 - 277 - rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV, 278 - iovstack_r, &iov_r); 279 - if (rc <= 0) 280 - goto free_iovecs; 281 - 279 + goto free_iov_l; 280 + iov_r = iovec_from_user(rvec, riovcnt, UIO_FASTIOV, iovstack_r, false); 281 + if (IS_ERR(iov_r)) { 282 + rc = PTR_ERR(iov_r); 283 + goto free_iov_l; 284 + } 282 285 rc = process_vm_rw_core(pid, &iter, iov_r, riovcnt, flags, vm_write); 283 - 284 - free_iovecs: 285 286 if (iov_r != iovstack_r) 286 287 kfree(iov_r); 288 + free_iov_l: 287 289 kfree(iov_l); 288 - 289 290 return rc; 290 291 } 291 292 ··· 300 307 { 301 308 return process_vm_rw(pid, lvec, liovcnt, rvec, riovcnt, flags, 1); 302 309 } 303 - 304 - #ifdef CONFIG_COMPAT 305 - 306 - static ssize_t 307 - compat_process_vm_rw(compat_pid_t pid, 308 - const struct compat_iovec __user *lvec, 309 - unsigned long liovcnt, 310 - const struct compat_iovec __user *rvec, 311 - unsigned long riovcnt, 312 - unsigned long flags, int vm_write) 313 - { 314 - struct iovec iovstack_l[UIO_FASTIOV]; 315 - struct iovec iovstack_r[UIO_FASTIOV]; 316 - struct iovec *iov_l = iovstack_l; 317 - struct iovec *iov_r = iovstack_r; 318 - struct iov_iter iter; 319 - ssize_t rc = -EFAULT; 320 - int dir = vm_write ? WRITE : READ; 321 - 322 - if (flags != 0) 323 - return -EINVAL; 324 - 325 - rc = compat_import_iovec(dir, lvec, liovcnt, UIO_FASTIOV, &iov_l, &iter); 326 - if (rc < 0) 327 - return rc; 328 - if (!iov_iter_count(&iter)) 329 - goto free_iovecs; 330 - rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, 331 - UIO_FASTIOV, iovstack_r, 332 - &iov_r); 333 - if (rc <= 0) 334 - goto free_iovecs; 335 - 336 - rc = process_vm_rw_core(pid, &iter, iov_r, riovcnt, flags, vm_write); 337 - 338 - free_iovecs: 339 - if (iov_r != iovstack_r) 340 - kfree(iov_r); 341 - kfree(iov_l); 342 - return rc; 343 - } 344 - 345 - COMPAT_SYSCALL_DEFINE6(process_vm_readv, compat_pid_t, pid, 346 - const struct compat_iovec __user *, lvec, 347 - compat_ulong_t, liovcnt, 348 - const struct compat_iovec __user *, rvec, 349 - compat_ulong_t, riovcnt, 350 - compat_ulong_t, flags) 351 - { 352 - return compat_process_vm_rw(pid, lvec, liovcnt, rvec, 353 - riovcnt, flags, 0); 354 - } 355 - 356 - COMPAT_SYSCALL_DEFINE6(process_vm_writev, compat_pid_t, pid, 357 - const struct compat_iovec __user *, lvec, 358 - compat_ulong_t, liovcnt, 359 - const struct compat_iovec __user *, rvec, 360 - compat_ulong_t, riovcnt, 361 - compat_ulong_t, flags) 362 - { 363 - return compat_process_vm_rw(pid, lvec, liovcnt, rvec, 364 - riovcnt, flags, 1); 365 - } 366 - 367 - #endif
+2 -2
net/compat.c
··· 98 98 if (err) 99 99 return err; 100 100 101 - err = compat_import_iovec(save_addr ? READ : WRITE, compat_ptr(ptr), 102 - len, UIO_FASTIOV, iov, &kmsg->msg_iter); 101 + err = import_iovec(save_addr ? READ : WRITE, compat_ptr(ptr), len, 102 + UIO_FASTIOV, iov, &kmsg->msg_iter); 103 103 return err < 0 ? err : 0; 104 104 } 105 105
+2 -35
security/keys/compat.c
··· 12 12 #include "internal.h" 13 13 14 14 /* 15 - * Instantiate a key with the specified compatibility multipart payload and 16 - * link the key into the destination keyring if one is given. 17 - * 18 - * The caller must have the appropriate instantiation permit set for this to 19 - * work (see keyctl_assume_authority). No other permissions are required. 20 - * 21 - * If successful, 0 will be returned. 22 - */ 23 - static long compat_keyctl_instantiate_key_iov( 24 - key_serial_t id, 25 - const struct compat_iovec __user *_payload_iov, 26 - unsigned ioc, 27 - key_serial_t ringid) 28 - { 29 - struct iovec iovstack[UIO_FASTIOV], *iov = iovstack; 30 - struct iov_iter from; 31 - long ret; 32 - 33 - if (!_payload_iov) 34 - ioc = 0; 35 - 36 - ret = compat_import_iovec(WRITE, _payload_iov, ioc, 37 - ARRAY_SIZE(iovstack), &iov, 38 - &from); 39 - if (ret < 0) 40 - return ret; 41 - 42 - ret = keyctl_instantiate_key_common(id, &from, ringid); 43 - kfree(iov); 44 - return ret; 45 - } 46 - 47 - /* 48 15 * The key control system call, 32-bit compatibility version for 64-bit archs 49 16 */ 50 17 COMPAT_SYSCALL_DEFINE5(keyctl, u32, option, ··· 81 114 return keyctl_reject_key(arg2, arg3, arg4, arg5); 82 115 83 116 case KEYCTL_INSTANTIATE_IOV: 84 - return compat_keyctl_instantiate_key_iov( 85 - arg2, compat_ptr(arg3), arg4, arg5); 117 + return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4, 118 + arg5); 86 119 87 120 case KEYCTL_INVALIDATE: 88 121 return keyctl_invalidate_key(arg2);
-5
security/keys/internal.h
··· 262 262 const struct iovec __user *, 263 263 unsigned, key_serial_t); 264 264 extern long keyctl_invalidate_key(key_serial_t); 265 - 266 - struct iov_iter; 267 - extern long keyctl_instantiate_key_common(key_serial_t, 268 - struct iov_iter *, 269 - key_serial_t); 270 265 extern long keyctl_restrict_keyring(key_serial_t id, 271 266 const char __user *_type, 272 267 const char __user *_restriction);
+1 -1
security/keys/keyctl.c
··· 1164 1164 * 1165 1165 * If successful, 0 will be returned. 1166 1166 */ 1167 - long keyctl_instantiate_key_common(key_serial_t id, 1167 + static long keyctl_instantiate_key_common(key_serial_t id, 1168 1168 struct iov_iter *from, 1169 1169 key_serial_t ringid) 1170 1170 {
+5 -7
tools/include/uapi/asm-generic/unistd.h
··· 207 207 #define __NR_write 64 208 208 __SYSCALL(__NR_write, sys_write) 209 209 #define __NR_readv 65 210 - __SC_COMP(__NR_readv, sys_readv, compat_sys_readv) 210 + __SC_COMP(__NR_readv, sys_readv, sys_readv) 211 211 #define __NR_writev 66 212 - __SC_COMP(__NR_writev, sys_writev, compat_sys_writev) 212 + __SC_COMP(__NR_writev, sys_writev, sys_writev) 213 213 #define __NR_pread64 67 214 214 __SC_COMP(__NR_pread64, sys_pread64, compat_sys_pread64) 215 215 #define __NR_pwrite64 68 ··· 237 237 238 238 /* fs/splice.c */ 239 239 #define __NR_vmsplice 75 240 - __SC_COMP(__NR_vmsplice, sys_vmsplice, compat_sys_vmsplice) 240 + __SYSCALL(__NR_vmsplice, sys_vmsplice) 241 241 #define __NR_splice 76 242 242 __SYSCALL(__NR_splice, sys_splice) 243 243 #define __NR_tee 77 ··· 727 727 #define __NR_sendmmsg 269 728 728 __SC_COMP(__NR_sendmmsg, sys_sendmmsg, compat_sys_sendmmsg) 729 729 #define __NR_process_vm_readv 270 730 - __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \ 731 - compat_sys_process_vm_readv) 730 + __SYSCALL(__NR_process_vm_readv, sys_process_vm_readv) 732 731 #define __NR_process_vm_writev 271 733 - __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ 734 - compat_sys_process_vm_writev) 732 + __SYSCALL(__NR_process_vm_writev, sys_process_vm_writev) 735 733 #define __NR_kcmp 272 736 734 __SYSCALL(__NR_kcmp, sys_kcmp) 737 735 #define __NR_finit_module 273
+5 -5
tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
··· 189 189 142 common _newselect sys_select compat_sys_select 190 190 143 common flock sys_flock 191 191 144 common msync sys_msync 192 - 145 common readv sys_readv compat_sys_readv 193 - 146 common writev sys_writev compat_sys_writev 192 + 145 common readv sys_readv 193 + 146 common writev sys_writev 194 194 147 common getsid sys_getsid 195 195 148 common fdatasync sys_fdatasync 196 196 149 nospu _sysctl sys_ni_syscall ··· 363 363 282 common unshare sys_unshare 364 364 283 common splice sys_splice 365 365 284 common tee sys_tee 366 - 285 common vmsplice sys_vmsplice compat_sys_vmsplice 366 + 285 common vmsplice sys_vmsplice 367 367 286 common openat sys_openat compat_sys_openat 368 368 287 common mkdirat sys_mkdirat 369 369 288 common mknodat sys_mknodat ··· 443 443 348 common syncfs sys_syncfs 444 444 349 common sendmmsg sys_sendmmsg compat_sys_sendmmsg 445 445 350 common setns sys_setns 446 - 351 nospu process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 447 - 352 nospu process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 446 + 351 nospu process_vm_readv sys_process_vm_readv 447 + 352 nospu process_vm_writev sys_process_vm_writev 448 448 353 nospu finit_module sys_finit_module 449 449 354 nospu kcmp sys_kcmp 450 450 355 common sched_setattr sys_sched_setattr
+5 -5
tools/perf/arch/s390/entry/syscalls/syscall.tbl
··· 134 134 142 64 select sys_select - 135 135 143 common flock sys_flock sys_flock 136 136 144 common msync sys_msync compat_sys_msync 137 - 145 common readv sys_readv compat_sys_readv 138 - 146 common writev sys_writev compat_sys_writev 137 + 145 common readv sys_readv 138 + 146 common writev sys_writev 139 139 147 common getsid sys_getsid sys_getsid 140 140 148 common fdatasync sys_fdatasync sys_fdatasync 141 141 149 common _sysctl - - ··· 316 316 306 common splice sys_splice compat_sys_splice 317 317 307 common sync_file_range sys_sync_file_range compat_sys_s390_sync_file_range 318 318 308 common tee sys_tee compat_sys_tee 319 - 309 common vmsplice sys_vmsplice compat_sys_vmsplice 319 + 309 common vmsplice sys_vmsplice sys_vmsplice 320 320 310 common move_pages sys_move_pages compat_sys_move_pages 321 321 311 common getcpu sys_getcpu compat_sys_getcpu 322 322 312 common epoll_pwait sys_epoll_pwait compat_sys_epoll_pwait ··· 347 347 337 common clock_adjtime sys_clock_adjtime compat_sys_clock_adjtime 348 348 338 common syncfs sys_syncfs sys_syncfs 349 349 339 common setns sys_setns sys_setns 350 - 340 common process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 351 - 341 common process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 350 + 340 common process_vm_readv sys_process_vm_readv sys_process_vm_readv 351 + 341 common process_vm_writev sys_process_vm_writev sys_process_vm_writev 352 352 342 common s390_runtime_instr sys_s390_runtime_instr sys_s390_runtime_instr 353 353 343 common kcmp sys_kcmp compat_sys_kcmp 354 354 344 common finit_module sys_finit_module compat_sys_finit_module
+5 -5
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl
··· 371 371 512 x32 rt_sigaction compat_sys_rt_sigaction 372 372 513 x32 rt_sigreturn compat_sys_x32_rt_sigreturn 373 373 514 x32 ioctl compat_sys_ioctl 374 - 515 x32 readv compat_sys_readv 375 - 516 x32 writev compat_sys_writev 374 + 515 x32 readv sys_readv 375 + 516 x32 writev sys_writev 376 376 517 x32 recvfrom compat_sys_recvfrom 377 377 518 x32 sendmsg compat_sys_sendmsg 378 378 519 x32 recvmsg compat_sys_recvmsg ··· 388 388 529 x32 waitid compat_sys_waitid 389 389 530 x32 set_robust_list compat_sys_set_robust_list 390 390 531 x32 get_robust_list compat_sys_get_robust_list 391 - 532 x32 vmsplice compat_sys_vmsplice 391 + 532 x32 vmsplice sys_vmsplice 392 392 533 x32 move_pages compat_sys_move_pages 393 393 534 x32 preadv compat_sys_preadv64 394 394 535 x32 pwritev compat_sys_pwritev64 395 395 536 x32 rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo 396 396 537 x32 recvmmsg compat_sys_recvmmsg_time64 397 397 538 x32 sendmmsg compat_sys_sendmmsg 398 - 539 x32 process_vm_readv compat_sys_process_vm_readv 399 - 540 x32 process_vm_writev compat_sys_process_vm_writev 398 + 539 x32 process_vm_readv sys_process_vm_readv 399 + 540 x32 process_vm_writev sys_process_vm_writev 400 400 541 x32 setsockopt sys_setsockopt 401 401 542 x32 getsockopt sys_getsockopt 402 402 543 x32 io_setup compat_sys_io_setup