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

Merge branch 'sockopt-cleanups'

Christoph Hellwig says:

====================
sockopt cleanups

this series cleans up various lose ends in the sockopt code, most
importantly removing the compat_{get,set}sockopt infrastructure in favor
of just using in_compat_syscall() in the few places that care.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+793 -1891
+2 -2
arch/arm64/include/asm/unistd32.h
··· 599 599 #define __NR_shutdown 293 600 600 __SYSCALL(__NR_shutdown, sys_shutdown) 601 601 #define __NR_setsockopt 294 602 - __SYSCALL(__NR_setsockopt, compat_sys_setsockopt) 602 + __SYSCALL(__NR_setsockopt, sys_setsockopt) 603 603 #define __NR_getsockopt 295 604 - __SYSCALL(__NR_getsockopt, compat_sys_getsockopt) 604 + __SYSCALL(__NR_getsockopt, sys_getsockopt) 605 605 #define __NR_sendmsg 296 606 606 __SYSCALL(__NR_sendmsg, compat_sys_sendmsg) 607 607 #define __NR_recvmsg 297
+2 -2
arch/mips/kernel/syscalls/syscall_n32.tbl
··· 60 60 50 n32 getsockname sys_getsockname 61 61 51 n32 getpeername sys_getpeername 62 62 52 n32 socketpair sys_socketpair 63 - 53 n32 setsockopt compat_sys_setsockopt 64 - 54 n32 getsockopt compat_sys_getsockopt 63 + 53 n32 setsockopt sys_setsockopt 64 + 54 n32 getsockopt sys_getsockopt 65 65 55 n32 clone __sys_clone 66 66 56 n32 fork __sys_fork 67 67 57 n32 execve compat_sys_execve
+2 -2
arch/mips/kernel/syscalls/syscall_o32.tbl
··· 184 184 170 o32 connect sys_connect 185 185 171 o32 getpeername sys_getpeername 186 186 172 o32 getsockname sys_getsockname 187 - 173 o32 getsockopt sys_getsockopt compat_sys_getsockopt 187 + 173 o32 getsockopt sys_getsockopt sys_getsockopt 188 188 174 o32 listen sys_listen 189 189 175 o32 recv sys_recv compat_sys_recv 190 190 176 o32 recvfrom sys_recvfrom compat_sys_recvfrom ··· 192 192 178 o32 send sys_send 193 193 179 o32 sendmsg sys_sendmsg compat_sys_sendmsg 194 194 180 o32 sendto sys_sendto 195 - 181 o32 setsockopt sys_setsockopt compat_sys_setsockopt 195 + 181 o32 setsockopt sys_setsockopt sys_setsockopt 196 196 182 o32 shutdown sys_shutdown 197 197 183 o32 socket sys_socket 198 198 184 o32 socketpair sys_socketpair
+2 -2
arch/parisc/kernel/syscalls/syscall.tbl
··· 198 198 178 common rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo 199 199 179 common rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend 200 200 180 common chown sys_chown 201 - 181 common setsockopt sys_setsockopt compat_sys_setsockopt 202 - 182 common getsockopt sys_getsockopt compat_sys_getsockopt 201 + 181 common setsockopt sys_setsockopt sys_setsockopt 202 + 182 common getsockopt sys_getsockopt sys_getsockopt 203 203 183 common sendmsg sys_sendmsg compat_sys_sendmsg 204 204 184 common recvmsg sys_recvmsg compat_sys_recvmsg 205 205 185 common semop sys_semop
+2 -2
arch/powerpc/kernel/syscalls/syscall.tbl
··· 433 433 336 common recv sys_recv compat_sys_recv 434 434 337 common recvfrom sys_recvfrom compat_sys_recvfrom 435 435 338 common shutdown sys_shutdown 436 - 339 common setsockopt sys_setsockopt compat_sys_setsockopt 437 - 340 common getsockopt sys_getsockopt compat_sys_getsockopt 436 + 339 common setsockopt sys_setsockopt sys_setsockopt 437 + 340 common getsockopt sys_getsockopt sys_getsockopt 438 438 341 common sendmsg sys_sendmsg compat_sys_sendmsg 439 439 342 common recvmsg sys_recvmsg compat_sys_recvmsg 440 440 343 32 recvmmsg sys_recvmmsg_time32 compat_sys_recvmmsg_time32
+2 -2
arch/s390/kernel/syscalls/syscall.tbl
··· 372 372 362 common connect sys_connect sys_connect 373 373 363 common listen sys_listen sys_listen 374 374 364 common accept4 sys_accept4 sys_accept4 375 - 365 common getsockopt sys_getsockopt compat_sys_getsockopt 376 - 366 common setsockopt sys_setsockopt compat_sys_setsockopt 375 + 365 common getsockopt sys_getsockopt sys_getsockopt 376 + 366 common setsockopt sys_setsockopt sys_setsockopt 377 377 367 common getsockname sys_getsockname sys_getsockname 378 378 368 common getpeername sys_getpeername sys_getpeername 379 379 369 common sendto sys_sendto sys_sendto
+6 -6
arch/sparc/kernel/sys32.S
··· 157 157 nop 158 158 nop 159 159 nop 160 - do_sys_setsockopt: /* compat_sys_setsockopt(int, int, int, char *, int) */ 160 + do_sys_setsockopt: /* sys_setsockopt(int, int, int, char *, int) */ 161 161 47: ldswa [%o1 + 0x0] %asi, %o0 162 - sethi %hi(compat_sys_setsockopt), %g1 162 + sethi %hi(sys_setsockopt), %g1 163 163 48: ldswa [%o1 + 0x8] %asi, %o2 164 164 49: lduwa [%o1 + 0xc] %asi, %o3 165 165 50: ldswa [%o1 + 0x10] %asi, %o4 166 - jmpl %g1 + %lo(compat_sys_setsockopt), %g0 166 + jmpl %g1 + %lo(sys_setsockopt), %g0 167 167 51: ldswa [%o1 + 0x4] %asi, %o1 168 168 nop 169 - do_sys_getsockopt: /* compat_sys_getsockopt(int, int, int, u32, u32) */ 169 + do_sys_getsockopt: /* sys_getsockopt(int, int, int, u32, u32) */ 170 170 52: ldswa [%o1 + 0x0] %asi, %o0 171 - sethi %hi(compat_sys_getsockopt), %g1 171 + sethi %hi(sys_getsockopt), %g1 172 172 53: ldswa [%o1 + 0x8] %asi, %o2 173 173 54: lduwa [%o1 + 0xc] %asi, %o3 174 174 55: lduwa [%o1 + 0x10] %asi, %o4 175 - jmpl %g1 + %lo(compat_sys_getsockopt), %g0 175 + jmpl %g1 + %lo(sys_getsockopt), %g0 176 176 56: ldswa [%o1 + 0x4] %asi, %o1 177 177 nop 178 178 do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
+2 -2
arch/sparc/kernel/syscalls/syscall.tbl
··· 147 147 115 32 getgroups32 sys_getgroups 148 148 116 common gettimeofday sys_gettimeofday compat_sys_gettimeofday 149 149 117 common getrusage sys_getrusage compat_sys_getrusage 150 - 118 common getsockopt sys_getsockopt compat_sys_getsockopt 150 + 118 common getsockopt sys_getsockopt sys_getsockopt 151 151 119 common getcwd sys_getcwd 152 152 120 common readv sys_readv compat_sys_readv 153 153 121 common writev sys_writev compat_sys_writev ··· 425 425 352 common userfaultfd sys_userfaultfd 426 426 353 common bind sys_bind 427 427 354 common listen sys_listen 428 - 355 common setsockopt sys_setsockopt compat_sys_setsockopt 428 + 355 common setsockopt sys_setsockopt sys_setsockopt 429 429 356 common mlock2 sys_mlock2 430 430 357 common copy_file_range sys_copy_file_range 431 431 358 common preadv2 sys_preadv2 compat_sys_preadv2
+7
arch/x86/entry/syscall_x32.c
··· 8 8 #include <asm/unistd.h> 9 9 #include <asm/syscall.h> 10 10 11 + /* 12 + * Reuse the 64-bit entry points for the x32 versions that occupy different 13 + * slots in the syscall table. 14 + */ 15 + #define __x32_sys_getsockopt __x64_sys_getsockopt 16 + #define __x32_sys_setsockopt __x64_sys_setsockopt 17 + 11 18 #define __SYSCALL_64(nr, sym) 12 19 13 20 #define __SYSCALL_X32(nr, sym) extern long __x32_##sym(const struct pt_regs *);
+2 -2
arch/x86/entry/syscalls/syscall_32.tbl
··· 376 376 362 i386 connect sys_connect 377 377 363 i386 listen sys_listen 378 378 364 i386 accept4 sys_accept4 379 - 365 i386 getsockopt sys_getsockopt compat_sys_getsockopt 380 - 366 i386 setsockopt sys_setsockopt compat_sys_setsockopt 379 + 365 i386 getsockopt sys_getsockopt sys_getsockopt 380 + 366 i386 setsockopt sys_setsockopt sys_setsockopt 381 381 367 i386 getsockname sys_getsockname 382 382 368 i386 getpeername sys_getpeername 383 383 369 i386 sendto sys_sendto
+2 -2
arch/x86/entry/syscalls/syscall_64.tbl
··· 396 396 538 x32 sendmmsg compat_sys_sendmmsg 397 397 539 x32 process_vm_readv compat_sys_process_vm_readv 398 398 540 x32 process_vm_writev compat_sys_process_vm_writev 399 - 541 x32 setsockopt compat_sys_setsockopt 400 - 542 x32 getsockopt compat_sys_getsockopt 399 + 541 x32 setsockopt sys_setsockopt 400 + 542 x32 getsockopt sys_getsockopt 401 401 543 x32 io_setup compat_sys_io_setup 402 402 544 x32 io_submit compat_sys_io_submit 403 403 545 x32 execveat compat_sys_execveat
-1
crypto/af_alg.c
··· 335 335 .ioctl = sock_no_ioctl, 336 336 .listen = sock_no_listen, 337 337 .shutdown = sock_no_shutdown, 338 - .getsockopt = sock_no_getsockopt, 339 338 .mmap = sock_no_mmap, 340 339 .sendpage = sock_no_sendpage, 341 340 .sendmsg = sock_no_sendmsg,
-4
crypto/algif_aead.c
··· 361 361 .ioctl = sock_no_ioctl, 362 362 .listen = sock_no_listen, 363 363 .shutdown = sock_no_shutdown, 364 - .getsockopt = sock_no_getsockopt, 365 364 .mmap = sock_no_mmap, 366 365 .bind = sock_no_bind, 367 366 .accept = sock_no_accept, 368 - .setsockopt = sock_no_setsockopt, 369 367 370 368 .release = af_alg_release, 371 369 .sendmsg = aead_sendmsg, ··· 452 454 .ioctl = sock_no_ioctl, 453 455 .listen = sock_no_listen, 454 456 .shutdown = sock_no_shutdown, 455 - .getsockopt = sock_no_getsockopt, 456 457 .mmap = sock_no_mmap, 457 458 .bind = sock_no_bind, 458 459 .accept = sock_no_accept, 459 - .setsockopt = sock_no_setsockopt, 460 460 461 461 .release = af_alg_release, 462 462 .sendmsg = aead_sendmsg_nokey,
-4
crypto/algif_hash.c
··· 279 279 .ioctl = sock_no_ioctl, 280 280 .listen = sock_no_listen, 281 281 .shutdown = sock_no_shutdown, 282 - .getsockopt = sock_no_getsockopt, 283 282 .mmap = sock_no_mmap, 284 283 .bind = sock_no_bind, 285 - .setsockopt = sock_no_setsockopt, 286 284 287 285 .release = af_alg_release, 288 286 .sendmsg = hash_sendmsg, ··· 381 383 .ioctl = sock_no_ioctl, 382 384 .listen = sock_no_listen, 383 385 .shutdown = sock_no_shutdown, 384 - .getsockopt = sock_no_getsockopt, 385 386 .mmap = sock_no_mmap, 386 387 .bind = sock_no_bind, 387 - .setsockopt = sock_no_setsockopt, 388 388 389 389 .release = af_alg_release, 390 390 .sendmsg = hash_sendmsg_nokey,
-2
crypto/algif_rng.c
··· 101 101 .ioctl = sock_no_ioctl, 102 102 .listen = sock_no_listen, 103 103 .shutdown = sock_no_shutdown, 104 - .getsockopt = sock_no_getsockopt, 105 104 .mmap = sock_no_mmap, 106 105 .bind = sock_no_bind, 107 106 .accept = sock_no_accept, 108 - .setsockopt = sock_no_setsockopt, 109 107 .sendmsg = sock_no_sendmsg, 110 108 .sendpage = sock_no_sendpage, 111 109
-4
crypto/algif_skcipher.c
··· 188 188 .ioctl = sock_no_ioctl, 189 189 .listen = sock_no_listen, 190 190 .shutdown = sock_no_shutdown, 191 - .getsockopt = sock_no_getsockopt, 192 191 .mmap = sock_no_mmap, 193 192 .bind = sock_no_bind, 194 193 .accept = sock_no_accept, 195 - .setsockopt = sock_no_setsockopt, 196 194 197 195 .release = af_alg_release, 198 196 .sendmsg = skcipher_sendmsg, ··· 279 281 .ioctl = sock_no_ioctl, 280 282 .listen = sock_no_listen, 281 283 .shutdown = sock_no_shutdown, 282 - .getsockopt = sock_no_getsockopt, 283 284 .mmap = sock_no_mmap, 284 285 .bind = sock_no_bind, 285 286 .accept = sock_no_accept, 286 - .setsockopt = sock_no_setsockopt, 287 287 288 288 .release = af_alg_release, 289 289 .sendmsg = skcipher_sendmsg_nokey,
-17
drivers/atm/eni.c
··· 2027 2027 return dev->phy->ioctl(dev,cmd,arg); 2028 2028 } 2029 2029 2030 - 2031 - static int eni_getsockopt(struct atm_vcc *vcc,int level,int optname, 2032 - void __user *optval,int optlen) 2033 - { 2034 - return -EINVAL; 2035 - } 2036 - 2037 - 2038 - static int eni_setsockopt(struct atm_vcc *vcc,int level,int optname, 2039 - void __user *optval,unsigned int optlen) 2040 - { 2041 - return -EINVAL; 2042 - } 2043 - 2044 - 2045 2030 static int eni_send(struct atm_vcc *vcc,struct sk_buff *skb) 2046 2031 { 2047 2032 enum enq_res res; ··· 2200 2215 .open = eni_open, 2201 2216 .close = eni_close, 2202 2217 .ioctl = eni_ioctl, 2203 - .getsockopt = eni_getsockopt, 2204 - .setsockopt = eni_setsockopt, 2205 2218 .send = eni_send, 2206 2219 .phy_put = eni_phy_put, 2207 2220 .phy_get = eni_phy_get,
-2
drivers/atm/firestream.c
··· 1277 1277 .send = fs_send, 1278 1278 .owner = THIS_MODULE, 1279 1279 /* ioctl: fs_ioctl, */ 1280 - /* getsockopt: fs_getsockopt, */ 1281 - /* setsockopt: fs_setsockopt, */ 1282 1280 /* change_qos: fs_change_qos, */ 1283 1281 1284 1282 /* For now implement these internally here... */
-27
drivers/atm/fore200e.c
··· 1710 1710 return 0; 1711 1711 } 1712 1712 1713 - 1714 - static int 1715 - fore200e_getsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen) 1716 - { 1717 - /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */ 1718 - 1719 - DPRINTK(2, "getsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n", 1720 - vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen); 1721 - 1722 - return -EINVAL; 1723 - } 1724 - 1725 - 1726 - static int 1727 - fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, unsigned int optlen) 1728 - { 1729 - /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */ 1730 - 1731 - DPRINTK(2, "setsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n", 1732 - vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen); 1733 - 1734 - return -EINVAL; 1735 - } 1736 - 1737 - 1738 1713 #if 0 /* currently unused */ 1739 1714 static int 1740 1715 fore200e_get_oc3(struct fore200e* fore200e, struct oc3_regs* regs) ··· 3001 3026 .open = fore200e_open, 3002 3027 .close = fore200e_close, 3003 3028 .ioctl = fore200e_ioctl, 3004 - .getsockopt = fore200e_getsockopt, 3005 - .setsockopt = fore200e_setsockopt, 3006 3029 .send = fore200e_send, 3007 3030 .change_qos = fore200e_change_qos, 3008 3031 .proc_read = fore200e_proc_read,
-40
drivers/atm/horizon.c
··· 2528 2528 } 2529 2529 2530 2530 #if 0 2531 - static int hrz_getsockopt (struct atm_vcc * atm_vcc, int level, int optname, 2532 - void *optval, int optlen) { 2533 - hrz_dev * dev = HRZ_DEV(atm_vcc->dev); 2534 - PRINTD (DBG_FLOW|DBG_VCC, "hrz_getsockopt"); 2535 - switch (level) { 2536 - case SOL_SOCKET: 2537 - switch (optname) { 2538 - // case SO_BCTXOPT: 2539 - // break; 2540 - // case SO_BCRXOPT: 2541 - // break; 2542 - default: 2543 - return -ENOPROTOOPT; 2544 - }; 2545 - break; 2546 - } 2547 - return -EINVAL; 2548 - } 2549 - 2550 - static int hrz_setsockopt (struct atm_vcc * atm_vcc, int level, int optname, 2551 - void *optval, unsigned int optlen) { 2552 - hrz_dev * dev = HRZ_DEV(atm_vcc->dev); 2553 - PRINTD (DBG_FLOW|DBG_VCC, "hrz_setsockopt"); 2554 - switch (level) { 2555 - case SOL_SOCKET: 2556 - switch (optname) { 2557 - // case SO_BCTXOPT: 2558 - // break; 2559 - // case SO_BCRXOPT: 2560 - // break; 2561 - default: 2562 - return -ENOPROTOOPT; 2563 - }; 2564 - break; 2565 - } 2566 - return -EINVAL; 2567 - } 2568 - #endif 2569 - 2570 - #if 0 2571 2531 static int hrz_ioctl (struct atm_dev * atm_dev, unsigned int cmd, void *arg) { 2572 2532 hrz_dev * dev = HRZ_DEV(atm_dev); 2573 2533 PRINTD (DBG_FLOW, "hrz_ioctl");
-16
drivers/atm/iphase.c
··· 2880 2880 return 0; 2881 2881 } 2882 2882 2883 - static int ia_getsockopt(struct atm_vcc *vcc, int level, int optname, 2884 - void __user *optval, int optlen) 2885 - { 2886 - IF_EVENT(printk(">ia_getsockopt\n");) 2887 - return -EINVAL; 2888 - } 2889 - 2890 - static int ia_setsockopt(struct atm_vcc *vcc, int level, int optname, 2891 - void __user *optval, unsigned int optlen) 2892 - { 2893 - IF_EVENT(printk(">ia_setsockopt\n");) 2894 - return -EINVAL; 2895 - } 2896 - 2897 2883 static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { 2898 2884 IADEV *iadev; 2899 2885 struct dle *wr_ptr; ··· 3150 3164 .open = ia_open, 3151 3165 .close = ia_close, 3152 3166 .ioctl = ia_ioctl, 3153 - .getsockopt = ia_getsockopt, 3154 - .setsockopt = ia_setsockopt, 3155 3167 .send = ia_send, 3156 3168 .phy_put = ia_phy_put, 3157 3169 .phy_get = ia_phy_get,
-2
drivers/atm/lanai.c
··· 2537 2537 .dev_close = lanai_dev_close, 2538 2538 .open = lanai_open, 2539 2539 .close = lanai_close, 2540 - .getsockopt = NULL, 2541 - .setsockopt = NULL, 2542 2540 .send = lanai_send, 2543 2541 .phy_put = NULL, 2544 2542 .phy_get = NULL,
-2
drivers/atm/solos-pci.c
··· 1179 1179 .open = popen, 1180 1180 .close = pclose, 1181 1181 .ioctl = NULL, 1182 - .getsockopt = NULL, 1183 - .setsockopt = NULL, 1184 1182 .send = psend, 1185 1183 .send_oam = NULL, 1186 1184 .phy_put = NULL,
-16
drivers/atm/zatm.c
··· 1515 1515 } 1516 1516 } 1517 1517 1518 - 1519 - static int zatm_getsockopt(struct atm_vcc *vcc,int level,int optname, 1520 - void __user *optval,int optlen) 1521 - { 1522 - return -EINVAL; 1523 - } 1524 - 1525 - 1526 - static int zatm_setsockopt(struct atm_vcc *vcc,int level,int optname, 1527 - void __user *optval,unsigned int optlen) 1528 - { 1529 - return -EINVAL; 1530 - } 1531 - 1532 1518 static int zatm_send(struct atm_vcc *vcc,struct sk_buff *skb) 1533 1519 { 1534 1520 int error; ··· 1568 1582 .open = zatm_open, 1569 1583 .close = zatm_close, 1570 1584 .ioctl = zatm_ioctl, 1571 - .getsockopt = zatm_getsockopt, 1572 - .setsockopt = zatm_setsockopt, 1573 1585 .send = zatm_send, 1574 1586 .phy_put = zatm_phy_put, 1575 1587 .phy_get = zatm_phy_get,
-2
drivers/isdn/mISDN/socket.c
··· 738 738 .recvmsg = sock_no_recvmsg, 739 739 .listen = sock_no_listen, 740 740 .shutdown = sock_no_shutdown, 741 - .setsockopt = sock_no_setsockopt, 742 - .getsockopt = sock_no_getsockopt, 743 741 .connect = sock_no_connect, 744 742 .socketpair = sock_no_socketpair, 745 743 .accept = sock_no_accept,
-2
drivers/net/ppp/pppoe.c
··· 1110 1110 .poll = datagram_poll, 1111 1111 .listen = sock_no_listen, 1112 1112 .shutdown = sock_no_shutdown, 1113 - .setsockopt = sock_no_setsockopt, 1114 - .getsockopt = sock_no_getsockopt, 1115 1113 .sendmsg = pppoe_sendmsg, 1116 1114 .recvmsg = pppoe_recvmsg, 1117 1115 .mmap = sock_no_mmap,
-2
drivers/net/ppp/pptp.c
··· 618 618 .getname = pptp_getname, 619 619 .listen = sock_no_listen, 620 620 .shutdown = sock_no_shutdown, 621 - .setsockopt = sock_no_setsockopt, 622 - .getsockopt = sock_no_getsockopt, 623 621 .sendmsg = sock_no_sendmsg, 624 622 .recvmsg = sock_no_recvmsg, 625 623 .mmap = sock_no_mmap,
-9
include/linux/atmdev.h
··· 176 176 #define ATM_OF_IMMED 1 /* Attempt immediate delivery */ 177 177 #define ATM_OF_INRATE 2 /* Attempt in-rate delivery */ 178 178 179 - 180 - /* 181 - * ioctl, getsockopt, and setsockopt are optional and can be set to NULL. 182 - */ 183 - 184 179 struct atmdev_ops { /* only send is required */ 185 180 void (*dev_close)(struct atm_dev *dev); 186 181 int (*open)(struct atm_vcc *vcc); ··· 185 190 int (*compat_ioctl)(struct atm_dev *dev,unsigned int cmd, 186 191 void __user *arg); 187 192 #endif 188 - int (*getsockopt)(struct atm_vcc *vcc,int level,int optname, 189 - void __user *optval,int optlen); 190 - int (*setsockopt)(struct atm_vcc *vcc,int level,int optname, 191 - void __user *optval,unsigned int optlen); 192 193 int (*send)(struct atm_vcc *vcc,struct sk_buff *skb); 193 194 int (*send_oam)(struct atm_vcc *vcc,void *cell,int flags); 194 195 void (*phy_put)(struct atm_dev *dev,unsigned char value,
-4
include/linux/compat.h
··· 737 737 asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len, 738 738 unsigned flags, struct sockaddr __user *addr, 739 739 int __user *addrlen); 740 - asmlinkage long compat_sys_setsockopt(int fd, int level, int optname, 741 - char __user *optval, unsigned int optlen); 742 - asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, 743 - char __user *optval, int __user *optlen); 744 740 asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, 745 741 unsigned flags); 746 742 asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
+2 -2
include/linux/filter.h
··· 502 502 offsetof(TYPE, MEMBER); \ 503 503 }) 504 504 505 - #ifdef CONFIG_COMPAT 506 505 /* A struct sock_filter is architecture independent. */ 507 506 struct compat_sock_fprog { 508 507 u16 len; 509 508 compat_uptr_t filter; /* struct sock_filter * */ 510 509 }; 511 - #endif 512 510 513 511 struct sock_fprog_kern { 514 512 u16 len; ··· 1275 1277 s32 optlen; 1276 1278 s32 retval; 1277 1279 }; 1280 + 1281 + int copy_bpf_fprog_from_user(struct sock_fprog *dst, void __user *src, int len); 1278 1282 1279 1283 #endif /* __LINUX_FILTER_H__ */
-6
include/linux/net.h
··· 165 165 int optname, char __user *optval, unsigned int optlen); 166 166 int (*getsockopt)(struct socket *sock, int level, 167 167 int optname, char __user *optval, int __user *optlen); 168 - #ifdef CONFIG_COMPAT 169 - int (*compat_setsockopt)(struct socket *sock, int level, 170 - int optname, char __user *optval, unsigned int optlen); 171 - int (*compat_getsockopt)(struct socket *sock, int level, 172 - int optname, char __user *optval, int __user *optlen); 173 - #endif 174 168 void (*show_fdinfo)(struct seq_file *m, struct socket *sock); 175 169 int (*sendmsg) (struct socket *sock, struct msghdr *m, 176 170 size_t total_len);
-14
include/linux/netfilter.h
··· 164 164 int set_optmin; 165 165 int set_optmax; 166 166 int (*set)(struct sock *sk, int optval, void __user *user, unsigned int len); 167 - #ifdef CONFIG_COMPAT 168 - int (*compat_set)(struct sock *sk, int optval, 169 - void __user *user, unsigned int len); 170 - #endif 171 167 int get_optmin; 172 168 int get_optmax; 173 169 int (*get)(struct sock *sk, int optval, void __user *user, int *len); 174 - #ifdef CONFIG_COMPAT 175 - int (*compat_get)(struct sock *sk, int optval, 176 - void __user *user, int *len); 177 - #endif 178 170 /* Use the module struct to lock set/get code in place */ 179 171 struct module *owner; 180 172 }; ··· 342 350 unsigned int len); 343 351 int nf_getsockopt(struct sock *sk, u_int8_t pf, int optval, char __user *opt, 344 352 int *len); 345 - #ifdef CONFIG_COMPAT 346 - int compat_nf_setsockopt(struct sock *sk, u_int8_t pf, int optval, 347 - char __user *opt, unsigned int len); 348 - int compat_nf_getsockopt(struct sock *sk, u_int8_t pf, int optval, 349 - char __user *opt, int *len); 350 - #endif 351 353 352 354 struct flowi; 353 355 struct nf_queue_entry;
+1 -1
include/linux/netfilter/x_tables.h
··· 302 302 int usersize, int size, int aligned_size); 303 303 304 304 void *xt_copy_counters_from_user(const void __user *user, unsigned int len, 305 - struct xt_counters_info *info, bool compat); 305 + struct xt_counters_info *info); 306 306 struct xt_counters *xt_counters_alloc(unsigned int counters); 307 307 308 308 struct xt_table *xt_register_table(struct net *net,
+4
include/linux/syscalls.h
··· 1424 1424 unsigned int nsops, 1425 1425 const struct old_timespec32 __user *timeout); 1426 1426 1427 + int __sys_getsockopt(int fd, int level, int optname, char __user *optval, 1428 + int __user *optlen); 1429 + int __sys_setsockopt(int fd, int level, int optname, char __user *optval, 1430 + int optlen); 1427 1431 #endif
-1
include/net/compat.h
··· 61 61 compat_size_t *len); 62 62 int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *, 63 63 struct sockaddr __user **, struct iovec **); 64 - struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval); 65 64 int put_cmsg_compat(struct msghdr*, int, int, int, void *); 66 65 67 66 int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *,
-13
include/net/inet_connection_sock.h
··· 48 48 char __user *optval, unsigned int optlen); 49 49 int (*getsockopt)(struct sock *sk, int level, int optname, 50 50 char __user *optval, int __user *optlen); 51 - #ifdef CONFIG_COMPAT 52 - int (*compat_setsockopt)(struct sock *sk, 53 - int level, int optname, 54 - char __user *optval, unsigned int optlen); 55 - int (*compat_getsockopt)(struct sock *sk, 56 - int level, int optname, 57 - char __user *optval, int __user *optlen); 58 - #endif 59 51 void (*addr2sockaddr)(struct sock *sk, struct sockaddr *); 60 52 void (*mtu_reduced)(struct sock *sk); 61 53 }; ··· 302 310 void inet_csk_listen_stop(struct sock *sk); 303 311 304 312 void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr); 305 - 306 - int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname, 307 - char __user *optval, int __user *optlen); 308 - int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname, 309 - char __user *optval, unsigned int optlen); 310 313 311 314 struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu); 312 315
-4
include/net/ip.h
··· 727 727 unsigned int optlen); 728 728 int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, 729 729 int __user *optlen); 730 - int compat_ip_setsockopt(struct sock *sk, int level, int optname, 731 - char __user *optval, unsigned int optlen); 732 - int compat_ip_getsockopt(struct sock *sk, int level, int optname, 733 - char __user *optval, int __user *optlen); 734 730 int ip_ra_control(struct sock *sk, unsigned char on, 735 731 void (*destructor)(struct sock *)); 736 732
-4
include/net/ipv6.h
··· 1088 1088 char __user *optval, unsigned int optlen); 1089 1089 int ipv6_getsockopt(struct sock *sk, int level, int optname, 1090 1090 char __user *optval, int __user *optlen); 1091 - int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, 1092 - char __user *optval, unsigned int optlen); 1093 - int compat_ipv6_getsockopt(struct sock *sk, int level, int optname, 1094 - char __user *optval, int __user *optlen); 1095 1091 1096 1092 int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, 1097 1093 int addr_len);
-10
include/net/sctp/structs.h
··· 438 438 int optname, 439 439 char __user *optval, 440 440 int __user *optlen); 441 - int (*compat_setsockopt) (struct sock *sk, 442 - int level, 443 - int optname, 444 - char __user *optval, 445 - unsigned int optlen); 446 - int (*compat_getsockopt) (struct sock *sk, 447 - int level, 448 - int optname, 449 - char __user *optval, 450 - int __user *optlen); 451 441 void (*get_dst) (struct sctp_transport *t, 452 442 union sctp_addr *saddr, 453 443 struct flowi *fl,
-14
include/net/sock.h
··· 1147 1147 int __user *option); 1148 1148 void (*keepalive)(struct sock *sk, int valbool); 1149 1149 #ifdef CONFIG_COMPAT 1150 - int (*compat_setsockopt)(struct sock *sk, 1151 - int level, 1152 - int optname, char __user *optval, 1153 - unsigned int optlen); 1154 - int (*compat_getsockopt)(struct sock *sk, 1155 - int level, 1156 - int optname, char __user *optval, 1157 - int __user *option); 1158 1150 int (*compat_ioctl)(struct sock *sk, 1159 1151 unsigned int cmd, unsigned long arg); 1160 1152 #endif ··· 1714 1722 int sock_no_ioctl(struct socket *, unsigned int, unsigned long); 1715 1723 int sock_no_listen(struct socket *, int); 1716 1724 int sock_no_shutdown(struct socket *, int); 1717 - int sock_no_getsockopt(struct socket *, int , int, char __user *, int __user *); 1718 - int sock_no_setsockopt(struct socket *, int, int, char __user *, unsigned int); 1719 1725 int sock_no_sendmsg(struct socket *, struct msghdr *, size_t); 1720 1726 int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len); 1721 1727 int sock_no_recvmsg(struct socket *, struct msghdr *, size_t, int); ··· 1734 1744 int flags); 1735 1745 int sock_common_setsockopt(struct socket *sock, int level, int optname, 1736 1746 char __user *optval, unsigned int optlen); 1737 - int compat_sock_common_getsockopt(struct socket *sock, int level, 1738 - int optname, char __user *optval, int __user *optlen); 1739 - int compat_sock_common_setsockopt(struct socket *sock, int level, 1740 - int optname, char __user *optval, unsigned int optlen); 1741 1747 1742 1748 void sk_common_release(struct sock *sk); 1743 1749
-4
include/net/tcp.h
··· 401 401 char __user *optval, int __user *optlen); 402 402 int tcp_setsockopt(struct sock *sk, int level, int optname, 403 403 char __user *optval, unsigned int optlen); 404 - int compat_tcp_getsockopt(struct sock *sk, int level, int optname, 405 - char __user *optval, int __user *optlen); 406 - int compat_tcp_setsockopt(struct sock *sk, int level, int optname, 407 - char __user *optval, unsigned int optlen); 408 404 void tcp_set_keepalive(struct sock *sk, int val); 409 405 void tcp_syn_ack_timeout(const struct request_sock *req); 410 406 int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
+2 -2
include/uapi/asm-generic/unistd.h
··· 606 606 #define __NR_recvfrom 207 607 607 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom) 608 608 #define __NR_setsockopt 208 609 - __SC_COMP(__NR_setsockopt, sys_setsockopt, compat_sys_setsockopt) 609 + __SC_COMP(__NR_setsockopt, sys_setsockopt, sys_setsockopt) 610 610 #define __NR_getsockopt 209 611 - __SC_COMP(__NR_getsockopt, sys_getsockopt, compat_sys_getsockopt) 611 + __SC_COMP(__NR_getsockopt, sys_getsockopt, sys_getsockopt) 612 612 #define __NR_shutdown 210 613 613 __SYSCALL(__NR_shutdown, sys_shutdown) 614 614 #define __NR_sendmsg 211
-2
net/appletalk/ddp.c
··· 1917 1917 #endif 1918 1918 .listen = sock_no_listen, 1919 1919 .shutdown = sock_no_shutdown, 1920 - .setsockopt = sock_no_setsockopt, 1921 - .getsockopt = sock_no_getsockopt, 1922 1920 .sendmsg = atalk_sendmsg, 1923 1921 .recvmsg = atalk_recvmsg, 1924 1922 .mmap = sock_no_mmap,
+2 -12
net/atm/common.c
··· 782 782 vcc->atm_options &= ~ATM_ATMOPT_CLP; 783 783 return 0; 784 784 default: 785 - if (level == SOL_SOCKET) 786 - return -EINVAL; 787 - break; 788 - } 789 - if (!vcc->dev || !vcc->dev->ops->setsockopt) 790 785 return -EINVAL; 791 - return vcc->dev->ops->setsockopt(vcc, level, optname, optval, optlen); 786 + } 792 787 } 793 788 794 789 int vcc_getsockopt(struct socket *sock, int level, int optname, ··· 821 826 return copy_to_user(optval, &pvc, sizeof(pvc)) ? -EFAULT : 0; 822 827 } 823 828 default: 824 - if (level == SOL_SOCKET) 825 - return -EINVAL; 826 - break; 827 - } 828 - if (!vcc->dev || !vcc->dev->ops->getsockopt) 829 829 return -EINVAL; 830 - return vcc->dev->ops->getsockopt(vcc, level, optname, optval, len); 830 + } 831 831 } 832 832 833 833 int register_atmdevice_notifier(struct notifier_block *nb)
-2
net/bluetooth/bnep/sock.c
··· 182 182 .recvmsg = sock_no_recvmsg, 183 183 .listen = sock_no_listen, 184 184 .shutdown = sock_no_shutdown, 185 - .setsockopt = sock_no_setsockopt, 186 - .getsockopt = sock_no_getsockopt, 187 185 .connect = sock_no_connect, 188 186 .socketpair = sock_no_socketpair, 189 187 .accept = sock_no_accept,
-2
net/bluetooth/cmtp/sock.c
··· 185 185 .recvmsg = sock_no_recvmsg, 186 186 .listen = sock_no_listen, 187 187 .shutdown = sock_no_shutdown, 188 - .setsockopt = sock_no_setsockopt, 189 - .getsockopt = sock_no_getsockopt, 190 188 .connect = sock_no_connect, 191 189 .socketpair = sock_no_socketpair, 192 190 .accept = sock_no_accept,
-2
net/bluetooth/hidp/sock.c
··· 233 233 .recvmsg = sock_no_recvmsg, 234 234 .listen = sock_no_listen, 235 235 .shutdown = sock_no_shutdown, 236 - .setsockopt = sock_no_setsockopt, 237 - .getsockopt = sock_no_getsockopt, 238 236 .connect = sock_no_connect, 239 237 .socketpair = sock_no_socketpair, 240 238 .accept = sock_no_accept,
+98 -116
net/bridge/netfilter/ebtables.c
··· 1451 1451 ebt_entry_to_user, entries, tmp.entries); 1452 1452 } 1453 1453 1454 - static int do_ebt_set_ctl(struct sock *sk, 1455 - int cmd, void __user *user, unsigned int len) 1456 - { 1457 - int ret; 1458 - struct net *net = sock_net(sk); 1459 - 1460 - if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 1461 - return -EPERM; 1462 - 1463 - switch (cmd) { 1464 - case EBT_SO_SET_ENTRIES: 1465 - ret = do_replace(net, user, len); 1466 - break; 1467 - case EBT_SO_SET_COUNTERS: 1468 - ret = update_counters(net, user, len); 1469 - break; 1470 - default: 1471 - ret = -EINVAL; 1472 - } 1473 - return ret; 1474 - } 1475 - 1476 - static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) 1477 - { 1478 - int ret; 1479 - struct ebt_replace tmp; 1480 - struct ebt_table *t; 1481 - struct net *net = sock_net(sk); 1482 - 1483 - if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 1484 - return -EPERM; 1485 - 1486 - if (copy_from_user(&tmp, user, sizeof(tmp))) 1487 - return -EFAULT; 1488 - 1489 - tmp.name[sizeof(tmp.name) - 1] = '\0'; 1490 - 1491 - t = find_table_lock(net, tmp.name, &ret, &ebt_mutex); 1492 - if (!t) 1493 - return ret; 1494 - 1495 - switch (cmd) { 1496 - case EBT_SO_GET_INFO: 1497 - case EBT_SO_GET_INIT_INFO: 1498 - if (*len != sizeof(struct ebt_replace)) { 1499 - ret = -EINVAL; 1500 - mutex_unlock(&ebt_mutex); 1501 - break; 1502 - } 1503 - if (cmd == EBT_SO_GET_INFO) { 1504 - tmp.nentries = t->private->nentries; 1505 - tmp.entries_size = t->private->entries_size; 1506 - tmp.valid_hooks = t->valid_hooks; 1507 - } else { 1508 - tmp.nentries = t->table->nentries; 1509 - tmp.entries_size = t->table->entries_size; 1510 - tmp.valid_hooks = t->table->valid_hooks; 1511 - } 1512 - mutex_unlock(&ebt_mutex); 1513 - if (copy_to_user(user, &tmp, *len) != 0) { 1514 - ret = -EFAULT; 1515 - break; 1516 - } 1517 - ret = 0; 1518 - break; 1519 - 1520 - case EBT_SO_GET_ENTRIES: 1521 - case EBT_SO_GET_INIT_ENTRIES: 1522 - ret = copy_everything_to_user(t, user, len, cmd); 1523 - mutex_unlock(&ebt_mutex); 1524 - break; 1525 - 1526 - default: 1527 - mutex_unlock(&ebt_mutex); 1528 - ret = -EINVAL; 1529 - } 1530 - 1531 - return ret; 1532 - } 1533 - 1534 1454 #ifdef CONFIG_COMPAT 1535 1455 /* 32 bit-userspace compatibility definitions. */ 1536 1456 struct compat_ebt_replace { ··· 2234 2314 hlp.num_counters, user, len); 2235 2315 } 2236 2316 2237 - static int compat_do_ebt_set_ctl(struct sock *sk, 2238 - int cmd, void __user *user, unsigned int len) 2239 - { 2240 - int ret; 2241 - struct net *net = sock_net(sk); 2242 - 2243 - if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 2244 - return -EPERM; 2245 - 2246 - switch (cmd) { 2247 - case EBT_SO_SET_ENTRIES: 2248 - ret = compat_do_replace(net, user, len); 2249 - break; 2250 - case EBT_SO_SET_COUNTERS: 2251 - ret = compat_update_counters(net, user, len); 2252 - break; 2253 - default: 2254 - ret = -EINVAL; 2255 - } 2256 - return ret; 2257 - } 2258 - 2259 2317 static int compat_do_ebt_get_ctl(struct sock *sk, int cmd, 2260 2318 void __user *user, int *len) 2261 2319 { ··· 2241 2343 struct compat_ebt_replace tmp; 2242 2344 struct ebt_table *t; 2243 2345 struct net *net = sock_net(sk); 2244 - 2245 - if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 2246 - return -EPERM; 2247 - 2248 - /* try real handler in case userland supplied needed padding */ 2249 - if ((cmd == EBT_SO_GET_INFO || 2250 - cmd == EBT_SO_GET_INIT_INFO) && *len != sizeof(tmp)) 2251 - return do_ebt_get_ctl(sk, cmd, user, len); 2252 2346 2253 2347 if (copy_from_user(&tmp, user, sizeof(tmp))) 2254 2348 return -EFAULT; ··· 2303 2413 } 2304 2414 #endif 2305 2415 2416 + static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) 2417 + { 2418 + struct net *net = sock_net(sk); 2419 + struct ebt_replace tmp; 2420 + struct ebt_table *t; 2421 + int ret; 2422 + 2423 + if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 2424 + return -EPERM; 2425 + 2426 + #ifdef CONFIG_COMPAT 2427 + /* try real handler in case userland supplied needed padding */ 2428 + if (in_compat_syscall() && 2429 + ((cmd != EBT_SO_GET_INFO && cmd != EBT_SO_GET_INIT_INFO) || 2430 + *len != sizeof(tmp))) 2431 + return compat_do_ebt_get_ctl(sk, cmd, user, len); 2432 + #endif 2433 + 2434 + if (copy_from_user(&tmp, user, sizeof(tmp))) 2435 + return -EFAULT; 2436 + 2437 + tmp.name[sizeof(tmp.name) - 1] = '\0'; 2438 + 2439 + t = find_table_lock(net, tmp.name, &ret, &ebt_mutex); 2440 + if (!t) 2441 + return ret; 2442 + 2443 + switch (cmd) { 2444 + case EBT_SO_GET_INFO: 2445 + case EBT_SO_GET_INIT_INFO: 2446 + if (*len != sizeof(struct ebt_replace)) { 2447 + ret = -EINVAL; 2448 + mutex_unlock(&ebt_mutex); 2449 + break; 2450 + } 2451 + if (cmd == EBT_SO_GET_INFO) { 2452 + tmp.nentries = t->private->nentries; 2453 + tmp.entries_size = t->private->entries_size; 2454 + tmp.valid_hooks = t->valid_hooks; 2455 + } else { 2456 + tmp.nentries = t->table->nentries; 2457 + tmp.entries_size = t->table->entries_size; 2458 + tmp.valid_hooks = t->table->valid_hooks; 2459 + } 2460 + mutex_unlock(&ebt_mutex); 2461 + if (copy_to_user(user, &tmp, *len) != 0) { 2462 + ret = -EFAULT; 2463 + break; 2464 + } 2465 + ret = 0; 2466 + break; 2467 + 2468 + case EBT_SO_GET_ENTRIES: 2469 + case EBT_SO_GET_INIT_ENTRIES: 2470 + ret = copy_everything_to_user(t, user, len, cmd); 2471 + mutex_unlock(&ebt_mutex); 2472 + break; 2473 + 2474 + default: 2475 + mutex_unlock(&ebt_mutex); 2476 + ret = -EINVAL; 2477 + } 2478 + 2479 + return ret; 2480 + } 2481 + 2482 + static int do_ebt_set_ctl(struct sock *sk, int cmd, void __user *user, 2483 + unsigned int len) 2484 + { 2485 + struct net *net = sock_net(sk); 2486 + int ret; 2487 + 2488 + if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 2489 + return -EPERM; 2490 + 2491 + switch (cmd) { 2492 + case EBT_SO_SET_ENTRIES: 2493 + #ifdef CONFIG_COMPAT 2494 + if (in_compat_syscall()) 2495 + ret = compat_do_replace(net, user, len); 2496 + else 2497 + #endif 2498 + ret = do_replace(net, user, len); 2499 + break; 2500 + case EBT_SO_SET_COUNTERS: 2501 + #ifdef CONFIG_COMPAT 2502 + if (in_compat_syscall()) 2503 + ret = compat_update_counters(net, user, len); 2504 + else 2505 + #endif 2506 + ret = update_counters(net, user, len); 2507 + break; 2508 + default: 2509 + ret = -EINVAL; 2510 + } 2511 + return ret; 2512 + } 2513 + 2306 2514 static struct nf_sockopt_ops ebt_sockopts = { 2307 2515 .pf = PF_INET, 2308 2516 .set_optmin = EBT_BASE_CTL, 2309 2517 .set_optmax = EBT_SO_SET_MAX + 1, 2310 2518 .set = do_ebt_set_ctl, 2311 - #ifdef CONFIG_COMPAT 2312 - .compat_set = compat_do_ebt_set_ctl, 2313 - #endif 2314 2519 .get_optmin = EBT_BASE_CTL, 2315 2520 .get_optmax = EBT_SO_GET_MAX + 1, 2316 2521 .get = do_ebt_get_ctl, 2317 - #ifdef CONFIG_COMPAT 2318 - .compat_get = compat_do_ebt_get_ctl, 2319 - #endif 2320 2522 .owner = THIS_MODULE, 2321 2523 }; 2322 2524
-2
net/caif/caif_socket.c
··· 981 981 .listen = sock_no_listen, 982 982 .shutdown = sock_no_shutdown, 983 983 .setsockopt = setsockopt, 984 - .getsockopt = sock_no_getsockopt, 985 984 .sendmsg = caif_seqpkt_sendmsg, 986 985 .recvmsg = caif_seqpkt_recvmsg, 987 986 .mmap = sock_no_mmap, ··· 1001 1002 .listen = sock_no_listen, 1002 1003 .shutdown = sock_no_shutdown, 1003 1004 .setsockopt = setsockopt, 1004 - .getsockopt = sock_no_getsockopt, 1005 1005 .sendmsg = caif_stream_sendmsg, 1006 1006 .recvmsg = caif_stream_recvmsg, 1007 1007 .mmap = sock_no_mmap,
-2
net/can/bcm.c
··· 1648 1648 .gettstamp = sock_gettstamp, 1649 1649 .listen = sock_no_listen, 1650 1650 .shutdown = sock_no_shutdown, 1651 - .setsockopt = sock_no_setsockopt, 1652 - .getsockopt = sock_no_getsockopt, 1653 1651 .sendmsg = bcm_sendmsg, 1654 1652 .recvmsg = bcm_recvmsg, 1655 1653 .mmap = sock_no_mmap,
+3 -119
net/compat.c
··· 335 335 __scm_destroy(scm); 336 336 } 337 337 338 - /* allocate a 64-bit sock_fprog on the user stack for duration of syscall. */ 339 - struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval) 340 - { 341 - struct compat_sock_fprog __user *fprog32 = (struct compat_sock_fprog __user *)optval; 342 - struct sock_fprog __user *kfprog = compat_alloc_user_space(sizeof(struct sock_fprog)); 343 - struct compat_sock_fprog f32; 344 - struct sock_fprog f; 345 - 346 - if (copy_from_user(&f32, fprog32, sizeof(*fprog32))) 347 - return NULL; 348 - memset(&f, 0, sizeof(f)); 349 - f.len = f32.len; 350 - f.filter = compat_ptr(f32.filter); 351 - if (copy_to_user(kfprog, &f, sizeof(struct sock_fprog))) 352 - return NULL; 353 - 354 - return kfprog; 355 - } 356 - EXPORT_SYMBOL_GPL(get_compat_bpf_fprog); 357 - 358 - static int do_set_attach_filter(struct socket *sock, int level, int optname, 359 - char __user *optval, unsigned int optlen) 360 - { 361 - struct sock_fprog __user *kfprog; 362 - 363 - kfprog = get_compat_bpf_fprog(optval); 364 - if (!kfprog) 365 - return -EFAULT; 366 - 367 - return sock_setsockopt(sock, level, optname, (char __user *)kfprog, 368 - sizeof(struct sock_fprog)); 369 - } 370 - 371 - static int compat_sock_setsockopt(struct socket *sock, int level, int optname, 372 - char __user *optval, unsigned int optlen) 373 - { 374 - if (optname == SO_ATTACH_FILTER || 375 - optname == SO_ATTACH_REUSEPORT_CBPF) 376 - return do_set_attach_filter(sock, level, optname, 377 - optval, optlen); 378 - return sock_setsockopt(sock, level, optname, optval, optlen); 379 - } 380 - 381 - static int __compat_sys_setsockopt(int fd, int level, int optname, 382 - char __user *optval, unsigned int optlen) 383 - { 384 - int err; 385 - struct socket *sock; 386 - 387 - if (optlen > INT_MAX) 388 - return -EINVAL; 389 - 390 - sock = sockfd_lookup(fd, &err); 391 - if (sock) { 392 - err = security_socket_setsockopt(sock, level, optname); 393 - if (err) { 394 - sockfd_put(sock); 395 - return err; 396 - } 397 - 398 - if (level == SOL_SOCKET) 399 - err = compat_sock_setsockopt(sock, level, 400 - optname, optval, optlen); 401 - else if (sock->ops->compat_setsockopt) 402 - err = sock->ops->compat_setsockopt(sock, level, 403 - optname, optval, optlen); 404 - else 405 - err = sock->ops->setsockopt(sock, level, 406 - optname, optval, optlen); 407 - sockfd_put(sock); 408 - } 409 - return err; 410 - } 411 - 412 - COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, 413 - char __user *, optval, unsigned int, optlen) 414 - { 415 - return __compat_sys_setsockopt(fd, level, optname, optval, optlen); 416 - } 417 - 418 - static int __compat_sys_getsockopt(int fd, int level, int optname, 419 - char __user *optval, 420 - int __user *optlen) 421 - { 422 - int err; 423 - struct socket *sock = sockfd_lookup(fd, &err); 424 - 425 - if (sock) { 426 - err = security_socket_getsockopt(sock, level, optname); 427 - if (err) { 428 - sockfd_put(sock); 429 - return err; 430 - } 431 - 432 - if (level == SOL_SOCKET) 433 - err = sock_getsockopt(sock, level, 434 - optname, optval, optlen); 435 - else if (sock->ops->compat_getsockopt) 436 - err = sock->ops->compat_getsockopt(sock, level, 437 - optname, optval, optlen); 438 - else 439 - err = sock->ops->getsockopt(sock, level, 440 - optname, optval, optlen); 441 - sockfd_put(sock); 442 - } 443 - return err; 444 - } 445 - 446 - COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname, 447 - char __user *, optval, int __user *, optlen) 448 - { 449 - return __compat_sys_getsockopt(fd, level, optname, optval, optlen); 450 - } 451 - 452 338 /* Argument list sizes for compat_sys_socketcall */ 453 339 #define AL(x) ((x) * sizeof(u32)) 454 340 static unsigned char nas[21] = { ··· 494 608 ret = __sys_shutdown(a0, a1); 495 609 break; 496 610 case SYS_SETSOCKOPT: 497 - ret = __compat_sys_setsockopt(a0, a1, a[2], 498 - compat_ptr(a[3]), a[4]); 611 + ret = __sys_setsockopt(a0, a1, a[2], compat_ptr(a[3]), a[4]); 499 612 break; 500 613 case SYS_GETSOCKOPT: 501 - ret = __compat_sys_getsockopt(a0, a1, a[2], 502 - compat_ptr(a[3]), 503 - compat_ptr(a[4])); 614 + ret = __sys_getsockopt(a0, a1, a[2], compat_ptr(a[3]), 615 + compat_ptr(a[4])); 504 616 break; 505 617 case SYS_SENDMSG: 506 618 ret = __compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
+23
net/core/filter.c
··· 77 77 #include <net/transp_v6.h> 78 78 #include <linux/btf_ids.h> 79 79 80 + int copy_bpf_fprog_from_user(struct sock_fprog *dst, void __user *src, int len) 81 + { 82 + if (in_compat_syscall()) { 83 + struct compat_sock_fprog f32; 84 + 85 + if (len != sizeof(f32)) 86 + return -EINVAL; 87 + if (copy_from_user(&f32, src, sizeof(f32))) 88 + return -EFAULT; 89 + memset(dst, 0, sizeof(*dst)); 90 + dst->len = f32.len; 91 + dst->filter = compat_ptr(f32.filter); 92 + } else { 93 + if (len != sizeof(*dst)) 94 + return -EINVAL; 95 + if (copy_from_user(dst, src, sizeof(*dst))) 96 + return -EFAULT; 97 + } 98 + 99 + return 0; 100 + } 101 + EXPORT_SYMBOL_GPL(copy_bpf_fprog_from_user); 102 + 80 103 /** 81 104 * sk_filter_trim_cap - run a packet through a socket filter 82 105 * @sk: sock associated with &sk_buff
+10 -62
net/core/sock.c
··· 1059 1059 ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen, optname == SO_SNDTIMEO_OLD); 1060 1060 break; 1061 1061 1062 - case SO_ATTACH_FILTER: 1063 - ret = -EINVAL; 1064 - if (optlen == sizeof(struct sock_fprog)) { 1065 - struct sock_fprog fprog; 1062 + case SO_ATTACH_FILTER: { 1063 + struct sock_fprog fprog; 1066 1064 1067 - ret = -EFAULT; 1068 - if (copy_from_user(&fprog, optval, sizeof(fprog))) 1069 - break; 1070 - 1065 + ret = copy_bpf_fprog_from_user(&fprog, optval, optlen); 1066 + if (!ret) 1071 1067 ret = sk_attach_filter(&fprog, sk); 1072 - } 1073 1068 break; 1074 - 1069 + } 1075 1070 case SO_ATTACH_BPF: 1076 1071 ret = -EINVAL; 1077 1072 if (optlen == sizeof(u32)) { ··· 1080 1085 } 1081 1086 break; 1082 1087 1083 - case SO_ATTACH_REUSEPORT_CBPF: 1084 - ret = -EINVAL; 1085 - if (optlen == sizeof(struct sock_fprog)) { 1086 - struct sock_fprog fprog; 1088 + case SO_ATTACH_REUSEPORT_CBPF: { 1089 + struct sock_fprog fprog; 1087 1090 1088 - ret = -EFAULT; 1089 - if (copy_from_user(&fprog, optval, sizeof(fprog))) 1090 - break; 1091 - 1091 + ret = copy_bpf_fprog_from_user(&fprog, optval, optlen); 1092 + if (!ret) 1092 1093 ret = sk_reuseport_attach_filter(&fprog, sk); 1093 - } 1094 1094 break; 1095 - 1095 + } 1096 1096 case SO_ATTACH_REUSEPORT_EBPF: 1097 1097 ret = -EINVAL; 1098 1098 if (optlen == sizeof(u32)) { ··· 2783 2793 } 2784 2794 EXPORT_SYMBOL(sock_no_shutdown); 2785 2795 2786 - int sock_no_setsockopt(struct socket *sock, int level, int optname, 2787 - char __user *optval, unsigned int optlen) 2788 - { 2789 - return -EOPNOTSUPP; 2790 - } 2791 - EXPORT_SYMBOL(sock_no_setsockopt); 2792 - 2793 - int sock_no_getsockopt(struct socket *sock, int level, int optname, 2794 - char __user *optval, int __user *optlen) 2795 - { 2796 - return -EOPNOTSUPP; 2797 - } 2798 - EXPORT_SYMBOL(sock_no_getsockopt); 2799 - 2800 2796 int sock_no_sendmsg(struct socket *sock, struct msghdr *m, size_t len) 2801 2797 { 2802 2798 return -EOPNOTSUPP; ··· 3189 3213 } 3190 3214 EXPORT_SYMBOL(sock_common_getsockopt); 3191 3215 3192 - #ifdef CONFIG_COMPAT 3193 - int compat_sock_common_getsockopt(struct socket *sock, int level, int optname, 3194 - char __user *optval, int __user *optlen) 3195 - { 3196 - struct sock *sk = sock->sk; 3197 - 3198 - if (sk->sk_prot->compat_getsockopt != NULL) 3199 - return sk->sk_prot->compat_getsockopt(sk, level, optname, 3200 - optval, optlen); 3201 - return sk->sk_prot->getsockopt(sk, level, optname, optval, optlen); 3202 - } 3203 - EXPORT_SYMBOL(compat_sock_common_getsockopt); 3204 - #endif 3205 - 3206 3216 int sock_common_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, 3207 3217 int flags) 3208 3218 { ··· 3215 3253 return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen); 3216 3254 } 3217 3255 EXPORT_SYMBOL(sock_common_setsockopt); 3218 - 3219 - #ifdef CONFIG_COMPAT 3220 - int compat_sock_common_setsockopt(struct socket *sock, int level, int optname, 3221 - char __user *optval, unsigned int optlen) 3222 - { 3223 - struct sock *sk = sock->sk; 3224 - 3225 - if (sk->sk_prot->compat_setsockopt != NULL) 3226 - return sk->sk_prot->compat_setsockopt(sk, level, optname, 3227 - optval, optlen); 3228 - return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen); 3229 - } 3230 - EXPORT_SYMBOL(compat_sock_common_setsockopt); 3231 - #endif 3232 3256 3233 3257 void sk_common_release(struct sock *sk) 3234 3258 {
-6
net/dccp/dccp.h
··· 296 296 char __user *optval, int __user *optlen); 297 297 int dccp_setsockopt(struct sock *sk, int level, int optname, 298 298 char __user *optval, unsigned int optlen); 299 - #ifdef CONFIG_COMPAT 300 - int compat_dccp_getsockopt(struct sock *sk, int level, int optname, 301 - char __user *optval, int __user *optlen); 302 - int compat_dccp_setsockopt(struct sock *sk, int level, int optname, 303 - char __user *optval, unsigned int optlen); 304 - #endif 305 299 int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg); 306 300 int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); 307 301 int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
-12
net/dccp/ipv4.c
··· 913 913 .getsockopt = ip_getsockopt, 914 914 .addr2sockaddr = inet_csk_addr2sockaddr, 915 915 .sockaddr_len = sizeof(struct sockaddr_in), 916 - #ifdef CONFIG_COMPAT 917 - .compat_setsockopt = compat_ip_setsockopt, 918 - .compat_getsockopt = compat_ip_getsockopt, 919 - #endif 920 916 }; 921 917 922 918 static int dccp_v4_init_sock(struct sock *sk) ··· 959 963 .rsk_prot = &dccp_request_sock_ops, 960 964 .twsk_prot = &dccp_timewait_sock_ops, 961 965 .h.hashinfo = &dccp_hashinfo, 962 - #ifdef CONFIG_COMPAT 963 - .compat_setsockopt = compat_dccp_setsockopt, 964 - .compat_getsockopt = compat_dccp_getsockopt, 965 - #endif 966 966 }; 967 967 968 968 static const struct net_protocol dccp_v4_protocol = { ··· 991 999 .recvmsg = sock_common_recvmsg, 992 1000 .mmap = sock_no_mmap, 993 1001 .sendpage = sock_no_sendpage, 994 - #ifdef CONFIG_COMPAT 995 - .compat_setsockopt = compat_sock_common_setsockopt, 996 - .compat_getsockopt = compat_sock_common_getsockopt, 997 - #endif 998 1002 }; 999 1003 1000 1004 static struct inet_protosw dccp_v4_protosw = {
-14
net/dccp/ipv6.c
··· 970 970 .getsockopt = ipv6_getsockopt, 971 971 .addr2sockaddr = inet6_csk_addr2sockaddr, 972 972 .sockaddr_len = sizeof(struct sockaddr_in6), 973 - #ifdef CONFIG_COMPAT 974 - .compat_setsockopt = compat_ipv6_setsockopt, 975 - .compat_getsockopt = compat_ipv6_getsockopt, 976 - #endif 977 973 }; 978 974 979 975 /* ··· 986 990 .getsockopt = ipv6_getsockopt, 987 991 .addr2sockaddr = inet6_csk_addr2sockaddr, 988 992 .sockaddr_len = sizeof(struct sockaddr_in6), 989 - #ifdef CONFIG_COMPAT 990 - .compat_setsockopt = compat_ipv6_setsockopt, 991 - .compat_getsockopt = compat_ipv6_getsockopt, 992 - #endif 993 993 }; 994 994 995 995 /* NOTE: A lot of things set to zero explicitly by call to ··· 1041 1049 .rsk_prot = &dccp6_request_sock_ops, 1042 1050 .twsk_prot = &dccp6_timewait_sock_ops, 1043 1051 .h.hashinfo = &dccp_hashinfo, 1044 - #ifdef CONFIG_COMPAT 1045 - .compat_setsockopt = compat_dccp_setsockopt, 1046 - .compat_getsockopt = compat_dccp_getsockopt, 1047 - #endif 1048 1052 }; 1049 1053 1050 1054 static const struct inet6_protocol dccp_v6_protocol = { ··· 1071 1083 .sendpage = sock_no_sendpage, 1072 1084 #ifdef CONFIG_COMPAT 1073 1085 .compat_ioctl = inet6_compat_ioctl, 1074 - .compat_setsockopt = compat_sock_common_setsockopt, 1075 - .compat_getsockopt = compat_sock_common_getsockopt, 1076 1086 #endif 1077 1087 }; 1078 1088
-26
net/dccp/proto.c
··· 575 575 576 576 EXPORT_SYMBOL_GPL(dccp_setsockopt); 577 577 578 - #ifdef CONFIG_COMPAT 579 - int compat_dccp_setsockopt(struct sock *sk, int level, int optname, 580 - char __user *optval, unsigned int optlen) 581 - { 582 - if (level != SOL_DCCP) 583 - return inet_csk_compat_setsockopt(sk, level, optname, 584 - optval, optlen); 585 - return do_dccp_setsockopt(sk, level, optname, optval, optlen); 586 - } 587 - 588 - EXPORT_SYMBOL_GPL(compat_dccp_setsockopt); 589 - #endif 590 - 591 578 static int dccp_getsockopt_service(struct sock *sk, int len, 592 579 __be32 __user *optval, 593 580 int __user *optlen) ··· 682 695 } 683 696 684 697 EXPORT_SYMBOL_GPL(dccp_getsockopt); 685 - 686 - #ifdef CONFIG_COMPAT 687 - int compat_dccp_getsockopt(struct sock *sk, int level, int optname, 688 - char __user *optval, int __user *optlen) 689 - { 690 - if (level != SOL_DCCP) 691 - return inet_csk_compat_getsockopt(sk, level, optname, 692 - optval, optlen); 693 - return do_dccp_getsockopt(sk, level, optname, optval, optlen); 694 - } 695 - 696 - EXPORT_SYMBOL_GPL(compat_dccp_getsockopt); 697 - #endif 698 698 699 699 static int dccp_msghdr_parse(struct msghdr *msg, struct sk_buff *skb) 700 700 {
-8
net/ieee802154/socket.c
··· 423 423 .recvmsg = sock_common_recvmsg, 424 424 .mmap = sock_no_mmap, 425 425 .sendpage = sock_no_sendpage, 426 - #ifdef CONFIG_COMPAT 427 - .compat_setsockopt = compat_sock_common_setsockopt, 428 - .compat_getsockopt = compat_sock_common_getsockopt, 429 - #endif 430 426 }; 431 427 432 428 /* DGRAM Sockets (802.15.4 dataframes) */ ··· 982 986 .recvmsg = sock_common_recvmsg, 983 987 .mmap = sock_no_mmap, 984 988 .sendpage = sock_no_sendpage, 985 - #ifdef CONFIG_COMPAT 986 - .compat_setsockopt = compat_sock_common_setsockopt, 987 - .compat_getsockopt = compat_sock_common_getsockopt, 988 - #endif 989 989 }; 990 990 991 991 /* Create a socket. Initialise the socket, blank the addresses
-6
net/ipv4/af_inet.c
··· 1043 1043 .sendpage_locked = tcp_sendpage_locked, 1044 1044 .peek_len = tcp_peek_len, 1045 1045 #ifdef CONFIG_COMPAT 1046 - .compat_setsockopt = compat_sock_common_setsockopt, 1047 - .compat_getsockopt = compat_sock_common_getsockopt, 1048 1046 .compat_ioctl = inet_compat_ioctl, 1049 1047 #endif 1050 1048 .set_rcvlowat = tcp_set_rcvlowat, ··· 1071 1073 .sendpage = inet_sendpage, 1072 1074 .set_peek_off = sk_set_peek_off, 1073 1075 #ifdef CONFIG_COMPAT 1074 - .compat_setsockopt = compat_sock_common_setsockopt, 1075 - .compat_getsockopt = compat_sock_common_getsockopt, 1076 1076 .compat_ioctl = inet_compat_ioctl, 1077 1077 #endif 1078 1078 }; ··· 1101 1105 .mmap = sock_no_mmap, 1102 1106 .sendpage = inet_sendpage, 1103 1107 #ifdef CONFIG_COMPAT 1104 - .compat_setsockopt = compat_sock_common_setsockopt, 1105 - .compat_getsockopt = compat_sock_common_getsockopt, 1106 1108 .compat_ioctl = inet_compat_ioctl, 1107 1109 #endif 1108 1110 };
-28
net/ipv4/inet_connection_sock.c
··· 1057 1057 } 1058 1058 EXPORT_SYMBOL_GPL(inet_csk_addr2sockaddr); 1059 1059 1060 - #ifdef CONFIG_COMPAT 1061 - int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname, 1062 - char __user *optval, int __user *optlen) 1063 - { 1064 - const struct inet_connection_sock *icsk = inet_csk(sk); 1065 - 1066 - if (icsk->icsk_af_ops->compat_getsockopt) 1067 - return icsk->icsk_af_ops->compat_getsockopt(sk, level, optname, 1068 - optval, optlen); 1069 - return icsk->icsk_af_ops->getsockopt(sk, level, optname, 1070 - optval, optlen); 1071 - } 1072 - EXPORT_SYMBOL_GPL(inet_csk_compat_getsockopt); 1073 - 1074 - int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname, 1075 - char __user *optval, unsigned int optlen) 1076 - { 1077 - const struct inet_connection_sock *icsk = inet_csk(sk); 1078 - 1079 - if (icsk->icsk_af_ops->compat_setsockopt) 1080 - return icsk->icsk_af_ops->compat_setsockopt(sk, level, optname, 1081 - optval, optlen); 1082 - return icsk->icsk_af_ops->setsockopt(sk, level, optname, 1083 - optval, optlen); 1084 - } 1085 - EXPORT_SYMBOL_GPL(inet_csk_compat_setsockopt); 1086 - #endif 1087 - 1088 1060 static struct dst_entry *inet_csk_rebuild_route(struct sock *sk, struct flowi *fl) 1089 1061 { 1090 1062 const struct inet_sock *inet = inet_sk(sk);
+236 -307
net/ipv4/ip_sockglue.c
··· 679 679 return -EADDRNOTAVAIL; 680 680 } 681 681 682 - static int do_mcast_group_source(struct sock *sk, int optname, 683 - struct group_source_req *greqs) 682 + static int copy_group_source_from_user(struct group_source_req *greqs, 683 + void __user *optval, int optlen) 684 684 { 685 + if (in_compat_syscall()) { 686 + struct compat_group_source_req gr32; 687 + 688 + if (optlen != sizeof(gr32)) 689 + return -EINVAL; 690 + if (copy_from_user(&gr32, optval, sizeof(gr32))) 691 + return -EFAULT; 692 + greqs->gsr_interface = gr32.gsr_interface; 693 + greqs->gsr_group = gr32.gsr_group; 694 + greqs->gsr_source = gr32.gsr_source; 695 + } else { 696 + if (optlen != sizeof(*greqs)) 697 + return -EINVAL; 698 + if (copy_from_user(greqs, optval, sizeof(*greqs))) 699 + return -EFAULT; 700 + } 701 + 702 + return 0; 703 + } 704 + 705 + static int do_mcast_group_source(struct sock *sk, int optname, 706 + void __user *optval, int optlen) 707 + { 708 + struct group_source_req greqs; 685 709 struct ip_mreq_source mreqs; 686 710 struct sockaddr_in *psin; 687 711 int omode, add, err; 688 712 689 - if (greqs->gsr_group.ss_family != AF_INET || 690 - greqs->gsr_source.ss_family != AF_INET) 713 + err = copy_group_source_from_user(&greqs, optval, optlen); 714 + if (err) 715 + return err; 716 + 717 + if (greqs.gsr_group.ss_family != AF_INET || 718 + greqs.gsr_source.ss_family != AF_INET) 691 719 return -EADDRNOTAVAIL; 692 720 693 - psin = (struct sockaddr_in *)&greqs->gsr_group; 721 + psin = (struct sockaddr_in *)&greqs.gsr_group; 694 722 mreqs.imr_multiaddr = psin->sin_addr.s_addr; 695 - psin = (struct sockaddr_in *)&greqs->gsr_source; 723 + psin = (struct sockaddr_in *)&greqs.gsr_source; 696 724 mreqs.imr_sourceaddr = psin->sin_addr.s_addr; 697 725 mreqs.imr_interface = 0; /* use index for mc_source */ 698 726 ··· 733 705 } else if (optname == MCAST_JOIN_SOURCE_GROUP) { 734 706 struct ip_mreqn mreq; 735 707 736 - psin = (struct sockaddr_in *)&greqs->gsr_group; 708 + psin = (struct sockaddr_in *)&greqs.gsr_group; 737 709 mreq.imr_multiaddr = psin->sin_addr; 738 710 mreq.imr_address.s_addr = 0; 739 - mreq.imr_ifindex = greqs->gsr_interface; 711 + mreq.imr_ifindex = greqs.gsr_interface; 740 712 err = ip_mc_join_group_ssm(sk, &mreq, MCAST_INCLUDE); 741 713 if (err && err != -EADDRINUSE) 742 714 return err; 743 - greqs->gsr_interface = mreq.imr_ifindex; 715 + greqs.gsr_interface = mreq.imr_ifindex; 744 716 omode = MCAST_INCLUDE; 745 717 add = 1; 746 718 } else /* MCAST_LEAVE_SOURCE_GROUP */ { 747 719 omode = MCAST_INCLUDE; 748 720 add = 0; 749 721 } 750 - return ip_mc_source(add, omode, sk, &mreqs, greqs->gsr_interface); 722 + return ip_mc_source(add, omode, sk, &mreqs, greqs.gsr_interface); 723 + } 724 + 725 + static int ip_set_mcast_msfilter(struct sock *sk, void __user *optval, 726 + int optlen) 727 + { 728 + struct group_filter *gsf = NULL; 729 + int err; 730 + 731 + if (optlen < GROUP_FILTER_SIZE(0)) 732 + return -EINVAL; 733 + if (optlen > sysctl_optmem_max) 734 + return -ENOBUFS; 735 + 736 + gsf = memdup_user(optval, optlen); 737 + if (IS_ERR(gsf)) 738 + return PTR_ERR(gsf); 739 + 740 + /* numsrc >= (4G-140)/128 overflow in 32 bits */ 741 + err = -ENOBUFS; 742 + if (gsf->gf_numsrc >= 0x1ffffff || 743 + gsf->gf_numsrc > sock_net(sk)->ipv4.sysctl_igmp_max_msf) 744 + goto out_free_gsf; 745 + 746 + err = -EINVAL; 747 + if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) 748 + goto out_free_gsf; 749 + 750 + err = set_mcast_msfilter(sk, gsf->gf_interface, gsf->gf_numsrc, 751 + gsf->gf_fmode, &gsf->gf_group, gsf->gf_slist); 752 + out_free_gsf: 753 + kfree(gsf); 754 + return err; 755 + } 756 + 757 + static int compat_ip_set_mcast_msfilter(struct sock *sk, void __user *optval, 758 + int optlen) 759 + { 760 + const int size0 = offsetof(struct compat_group_filter, gf_slist); 761 + struct compat_group_filter *gf32; 762 + unsigned int n; 763 + void *p; 764 + int err; 765 + 766 + if (optlen < size0) 767 + return -EINVAL; 768 + if (optlen > sysctl_optmem_max - 4) 769 + return -ENOBUFS; 770 + 771 + p = kmalloc(optlen + 4, GFP_KERNEL); 772 + if (!p) 773 + return -ENOMEM; 774 + gf32 = p + 4; /* we want ->gf_group and ->gf_slist aligned */ 775 + 776 + err = -EFAULT; 777 + if (copy_from_user(gf32, optval, optlen)) 778 + goto out_free_gsf; 779 + 780 + /* numsrc >= (4G-140)/128 overflow in 32 bits */ 781 + n = gf32->gf_numsrc; 782 + err = -ENOBUFS; 783 + if (n >= 0x1ffffff) 784 + goto out_free_gsf; 785 + 786 + err = -EINVAL; 787 + if (offsetof(struct compat_group_filter, gf_slist[n]) > optlen) 788 + goto out_free_gsf; 789 + 790 + /* numsrc >= (4G-140)/128 overflow in 32 bits */ 791 + err = -ENOBUFS; 792 + if (n > sock_net(sk)->ipv4.sysctl_igmp_max_msf) 793 + goto out_free_gsf; 794 + err = set_mcast_msfilter(sk, gf32->gf_interface, n, gf32->gf_fmode, 795 + &gf32->gf_group, gf32->gf_slist); 796 + out_free_gsf: 797 + kfree(p); 798 + return err; 799 + } 800 + 801 + static int ip_mcast_join_leave(struct sock *sk, int optname, 802 + void __user *optval, int optlen) 803 + { 804 + struct ip_mreqn mreq = { }; 805 + struct sockaddr_in *psin; 806 + struct group_req greq; 807 + 808 + if (optlen < sizeof(struct group_req)) 809 + return -EINVAL; 810 + if (copy_from_user(&greq, optval, sizeof(greq))) 811 + return -EFAULT; 812 + 813 + psin = (struct sockaddr_in *)&greq.gr_group; 814 + if (psin->sin_family != AF_INET) 815 + return -EINVAL; 816 + mreq.imr_multiaddr = psin->sin_addr; 817 + mreq.imr_ifindex = greq.gr_interface; 818 + if (optname == MCAST_JOIN_GROUP) 819 + return ip_mc_join_group(sk, &mreq); 820 + return ip_mc_leave_group(sk, &mreq); 821 + } 822 + 823 + static int compat_ip_mcast_join_leave(struct sock *sk, int optname, 824 + void __user *optval, int optlen) 825 + { 826 + struct compat_group_req greq; 827 + struct ip_mreqn mreq = { }; 828 + struct sockaddr_in *psin; 829 + 830 + if (optlen < sizeof(struct compat_group_req)) 831 + return -EINVAL; 832 + if (copy_from_user(&greq, optval, sizeof(greq))) 833 + return -EFAULT; 834 + 835 + psin = (struct sockaddr_in *)&greq.gr_group; 836 + if (psin->sin_family != AF_INET) 837 + return -EINVAL; 838 + mreq.imr_multiaddr = psin->sin_addr; 839 + mreq.imr_ifindex = greq.gr_interface; 840 + 841 + if (optname == MCAST_JOIN_GROUP) 842 + return ip_mc_join_group(sk, &mreq); 843 + return ip_mc_leave_group(sk, &mreq); 751 844 } 752 845 753 846 static int do_ip_setsockopt(struct sock *sk, int level, ··· 1276 1127 } 1277 1128 case MCAST_JOIN_GROUP: 1278 1129 case MCAST_LEAVE_GROUP: 1279 - { 1280 - struct group_req greq; 1281 - struct sockaddr_in *psin; 1282 - struct ip_mreqn mreq; 1283 - 1284 - if (optlen < sizeof(struct group_req)) 1285 - goto e_inval; 1286 - err = -EFAULT; 1287 - if (copy_from_user(&greq, optval, sizeof(greq))) 1288 - break; 1289 - psin = (struct sockaddr_in *)&greq.gr_group; 1290 - if (psin->sin_family != AF_INET) 1291 - goto e_inval; 1292 - memset(&mreq, 0, sizeof(mreq)); 1293 - mreq.imr_multiaddr = psin->sin_addr; 1294 - mreq.imr_ifindex = greq.gr_interface; 1295 - 1296 - if (optname == MCAST_JOIN_GROUP) 1297 - err = ip_mc_join_group(sk, &mreq); 1130 + if (in_compat_syscall()) 1131 + err = compat_ip_mcast_join_leave(sk, optname, optval, 1132 + optlen); 1298 1133 else 1299 - err = ip_mc_leave_group(sk, &mreq); 1134 + err = ip_mcast_join_leave(sk, optname, optval, optlen); 1300 1135 break; 1301 - } 1302 1136 case MCAST_JOIN_SOURCE_GROUP: 1303 1137 case MCAST_LEAVE_SOURCE_GROUP: 1304 1138 case MCAST_BLOCK_SOURCE: 1305 1139 case MCAST_UNBLOCK_SOURCE: 1306 - { 1307 - struct group_source_req greqs; 1308 - 1309 - if (optlen != sizeof(struct group_source_req)) 1310 - goto e_inval; 1311 - if (copy_from_user(&greqs, optval, sizeof(greqs))) { 1312 - err = -EFAULT; 1313 - break; 1314 - } 1315 - err = do_mcast_group_source(sk, optname, &greqs); 1140 + err = do_mcast_group_source(sk, optname, optval, optlen); 1316 1141 break; 1317 - } 1318 1142 case MCAST_MSFILTER: 1319 - { 1320 - struct group_filter *gsf = NULL; 1321 - 1322 - if (optlen < GROUP_FILTER_SIZE(0)) 1323 - goto e_inval; 1324 - if (optlen > sysctl_optmem_max) { 1325 - err = -ENOBUFS; 1326 - break; 1327 - } 1328 - gsf = memdup_user(optval, optlen); 1329 - if (IS_ERR(gsf)) { 1330 - err = PTR_ERR(gsf); 1331 - break; 1332 - } 1333 - /* numsrc >= (4G-140)/128 overflow in 32 bits */ 1334 - if (gsf->gf_numsrc >= 0x1ffffff || 1335 - gsf->gf_numsrc > net->ipv4.sysctl_igmp_max_msf) { 1336 - err = -ENOBUFS; 1337 - goto mc_msf_out; 1338 - } 1339 - if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) { 1340 - err = -EINVAL; 1341 - goto mc_msf_out; 1342 - } 1343 - err = set_mcast_msfilter(sk, gsf->gf_interface, 1344 - gsf->gf_numsrc, gsf->gf_fmode, 1345 - &gsf->gf_group, gsf->gf_slist); 1346 - mc_msf_out: 1347 - kfree(gsf); 1143 + if (in_compat_syscall()) 1144 + err = compat_ip_set_mcast_msfilter(sk, optval, optlen); 1145 + else 1146 + err = ip_set_mcast_msfilter(sk, optval, optlen); 1348 1147 break; 1349 - } 1350 1148 case IP_MULTICAST_ALL: 1351 1149 if (optlen < 1) 1352 1150 goto e_inval; ··· 1418 1322 } 1419 1323 EXPORT_SYMBOL(ip_setsockopt); 1420 1324 1421 - #ifdef CONFIG_COMPAT 1422 - int compat_ip_setsockopt(struct sock *sk, int level, int optname, 1423 - char __user *optval, unsigned int optlen) 1424 - { 1425 - int err; 1426 - 1427 - if (level != SOL_IP) 1428 - return -ENOPROTOOPT; 1429 - 1430 - switch (optname) { 1431 - case MCAST_JOIN_GROUP: 1432 - case MCAST_LEAVE_GROUP: 1433 - { 1434 - struct compat_group_req __user *gr32 = (void __user *)optval; 1435 - struct group_req greq; 1436 - struct sockaddr_in *psin = (struct sockaddr_in *)&greq.gr_group; 1437 - struct ip_mreqn mreq; 1438 - 1439 - if (optlen < sizeof(struct compat_group_req)) 1440 - return -EINVAL; 1441 - 1442 - if (get_user(greq.gr_interface, &gr32->gr_interface) || 1443 - copy_from_user(&greq.gr_group, &gr32->gr_group, 1444 - sizeof(greq.gr_group))) 1445 - return -EFAULT; 1446 - 1447 - if (psin->sin_family != AF_INET) 1448 - return -EINVAL; 1449 - 1450 - memset(&mreq, 0, sizeof(mreq)); 1451 - mreq.imr_multiaddr = psin->sin_addr; 1452 - mreq.imr_ifindex = greq.gr_interface; 1453 - 1454 - rtnl_lock(); 1455 - lock_sock(sk); 1456 - if (optname == MCAST_JOIN_GROUP) 1457 - err = ip_mc_join_group(sk, &mreq); 1458 - else 1459 - err = ip_mc_leave_group(sk, &mreq); 1460 - release_sock(sk); 1461 - rtnl_unlock(); 1462 - return err; 1463 - } 1464 - case MCAST_JOIN_SOURCE_GROUP: 1465 - case MCAST_LEAVE_SOURCE_GROUP: 1466 - case MCAST_BLOCK_SOURCE: 1467 - case MCAST_UNBLOCK_SOURCE: 1468 - { 1469 - struct compat_group_source_req __user *gsr32 = (void __user *)optval; 1470 - struct group_source_req greqs; 1471 - 1472 - if (optlen != sizeof(struct compat_group_source_req)) 1473 - return -EINVAL; 1474 - 1475 - if (get_user(greqs.gsr_interface, &gsr32->gsr_interface) || 1476 - copy_from_user(&greqs.gsr_group, &gsr32->gsr_group, 1477 - sizeof(greqs.gsr_group)) || 1478 - copy_from_user(&greqs.gsr_source, &gsr32->gsr_source, 1479 - sizeof(greqs.gsr_source))) 1480 - return -EFAULT; 1481 - 1482 - rtnl_lock(); 1483 - lock_sock(sk); 1484 - err = do_mcast_group_source(sk, optname, &greqs); 1485 - release_sock(sk); 1486 - rtnl_unlock(); 1487 - return err; 1488 - } 1489 - case MCAST_MSFILTER: 1490 - { 1491 - const int size0 = offsetof(struct compat_group_filter, gf_slist); 1492 - struct compat_group_filter *gf32; 1493 - unsigned int n; 1494 - void *p; 1495 - 1496 - if (optlen < size0) 1497 - return -EINVAL; 1498 - if (optlen > sysctl_optmem_max - 4) 1499 - return -ENOBUFS; 1500 - 1501 - p = kmalloc(optlen + 4, GFP_KERNEL); 1502 - if (!p) 1503 - return -ENOMEM; 1504 - gf32 = p + 4; /* we want ->gf_group and ->gf_slist aligned */ 1505 - if (copy_from_user(gf32, optval, optlen)) { 1506 - err = -EFAULT; 1507 - goto mc_msf_out; 1508 - } 1509 - 1510 - n = gf32->gf_numsrc; 1511 - /* numsrc >= (4G-140)/128 overflow in 32 bits */ 1512 - if (n >= 0x1ffffff) { 1513 - err = -ENOBUFS; 1514 - goto mc_msf_out; 1515 - } 1516 - if (offsetof(struct compat_group_filter, gf_slist[n]) > optlen) { 1517 - err = -EINVAL; 1518 - goto mc_msf_out; 1519 - } 1520 - 1521 - rtnl_lock(); 1522 - lock_sock(sk); 1523 - /* numsrc >= (4G-140)/128 overflow in 32 bits */ 1524 - if (n > sock_net(sk)->ipv4.sysctl_igmp_max_msf) 1525 - err = -ENOBUFS; 1526 - else 1527 - err = set_mcast_msfilter(sk, gf32->gf_interface, 1528 - n, gf32->gf_fmode, 1529 - &gf32->gf_group, gf32->gf_slist); 1530 - release_sock(sk); 1531 - rtnl_unlock(); 1532 - mc_msf_out: 1533 - kfree(p); 1534 - return err; 1535 - } 1536 - } 1537 - 1538 - err = do_ip_setsockopt(sk, level, optname, optval, optlen); 1539 - #ifdef CONFIG_NETFILTER 1540 - /* we need to exclude all possible ENOPROTOOPTs except default case */ 1541 - if (err == -ENOPROTOOPT && optname != IP_HDRINCL && 1542 - optname != IP_IPSEC_POLICY && 1543 - optname != IP_XFRM_POLICY && 1544 - !ip_mroute_opt(optname)) 1545 - err = compat_nf_setsockopt(sk, PF_INET, optname, optval, 1546 - optlen); 1547 - #endif 1548 - return err; 1549 - } 1550 - EXPORT_SYMBOL(compat_ip_setsockopt); 1551 - #endif 1552 - 1553 1325 /* 1554 1326 * Get the options. Note for future reference. The GET of IP options gets 1555 1327 * the _received_ ones. The set sets the _sent_ ones. ··· 1433 1469 return false; 1434 1470 } 1435 1471 1472 + static int ip_get_mcast_msfilter(struct sock *sk, void __user *optval, 1473 + int __user *optlen, int len) 1474 + { 1475 + const int size0 = offsetof(struct group_filter, gf_slist); 1476 + struct group_filter __user *p = optval; 1477 + struct group_filter gsf; 1478 + int num; 1479 + int err; 1480 + 1481 + if (len < size0) 1482 + return -EINVAL; 1483 + if (copy_from_user(&gsf, p, size0)) 1484 + return -EFAULT; 1485 + 1486 + num = gsf.gf_numsrc; 1487 + err = ip_mc_gsfget(sk, &gsf, p->gf_slist); 1488 + if (err) 1489 + return err; 1490 + if (gsf.gf_numsrc < num) 1491 + num = gsf.gf_numsrc; 1492 + if (put_user(GROUP_FILTER_SIZE(num), optlen) || 1493 + copy_to_user(p, &gsf, size0)) 1494 + return -EFAULT; 1495 + return 0; 1496 + } 1497 + 1498 + static int compat_ip_get_mcast_msfilter(struct sock *sk, void __user *optval, 1499 + int __user *optlen, int len) 1500 + { 1501 + const int size0 = offsetof(struct compat_group_filter, gf_slist); 1502 + struct compat_group_filter __user *p = optval; 1503 + struct compat_group_filter gf32; 1504 + struct group_filter gf; 1505 + int num; 1506 + int err; 1507 + 1508 + if (len < size0) 1509 + return -EINVAL; 1510 + if (copy_from_user(&gf32, p, size0)) 1511 + return -EFAULT; 1512 + 1513 + gf.gf_interface = gf32.gf_interface; 1514 + gf.gf_fmode = gf32.gf_fmode; 1515 + num = gf.gf_numsrc = gf32.gf_numsrc; 1516 + gf.gf_group = gf32.gf_group; 1517 + 1518 + err = ip_mc_gsfget(sk, &gf, p->gf_slist); 1519 + if (err) 1520 + return err; 1521 + if (gf.gf_numsrc < num) 1522 + num = gf.gf_numsrc; 1523 + len = GROUP_FILTER_SIZE(num) - (sizeof(gf) - sizeof(gf32)); 1524 + if (put_user(len, optlen) || 1525 + put_user(gf.gf_fmode, &p->gf_fmode) || 1526 + put_user(gf.gf_numsrc, &p->gf_numsrc)) 1527 + return -EFAULT; 1528 + return 0; 1529 + } 1530 + 1436 1531 static int do_ip_getsockopt(struct sock *sk, int level, int optname, 1437 - char __user *optval, int __user *optlen, unsigned int flags) 1532 + char __user *optval, int __user *optlen) 1438 1533 { 1439 1534 struct inet_sock *inet = inet_sk(sk); 1440 1535 bool needs_rtnl = getsockopt_needs_rtnl(optname); ··· 1650 1627 goto out; 1651 1628 } 1652 1629 case MCAST_MSFILTER: 1653 - { 1654 - struct group_filter __user *p = (void __user *)optval; 1655 - struct group_filter gsf; 1656 - const int size0 = offsetof(struct group_filter, gf_slist); 1657 - int num; 1658 - 1659 - if (len < size0) { 1660 - err = -EINVAL; 1661 - goto out; 1662 - } 1663 - if (copy_from_user(&gsf, p, size0)) { 1664 - err = -EFAULT; 1665 - goto out; 1666 - } 1667 - num = gsf.gf_numsrc; 1668 - err = ip_mc_gsfget(sk, &gsf, p->gf_slist); 1669 - if (err) 1670 - goto out; 1671 - if (gsf.gf_numsrc < num) 1672 - num = gsf.gf_numsrc; 1673 - if (put_user(GROUP_FILTER_SIZE(num), optlen) || 1674 - copy_to_user(p, &gsf, size0)) 1675 - err = -EFAULT; 1630 + if (in_compat_syscall()) 1631 + err = compat_ip_get_mcast_msfilter(sk, optval, optlen, 1632 + len); 1633 + else 1634 + err = ip_get_mcast_msfilter(sk, optval, optlen, len); 1676 1635 goto out; 1677 - } 1678 1636 case IP_MULTICAST_ALL: 1679 1637 val = inet->mc_all; 1680 1638 break; ··· 1671 1667 msg.msg_control_is_user = true; 1672 1668 msg.msg_control_user = optval; 1673 1669 msg.msg_controllen = len; 1674 - msg.msg_flags = flags; 1670 + msg.msg_flags = in_compat_syscall() ? MSG_CMSG_COMPAT : 0; 1675 1671 1676 1672 if (inet->cmsg_flags & IP_CMSG_PKTINFO) { 1677 1673 struct in_pktinfo info; ··· 1735 1731 { 1736 1732 int err; 1737 1733 1738 - err = do_ip_getsockopt(sk, level, optname, optval, optlen, 0); 1734 + err = do_ip_getsockopt(sk, level, optname, optval, optlen); 1735 + 1739 1736 #if IS_ENABLED(CONFIG_BPFILTER_UMH) 1740 1737 if (optname >= BPFILTER_IPT_SO_GET_INFO && 1741 1738 optname < BPFILTER_IPT_GET_MAX) ··· 1760 1755 return err; 1761 1756 } 1762 1757 EXPORT_SYMBOL(ip_getsockopt); 1763 - 1764 - #ifdef CONFIG_COMPAT 1765 - int compat_ip_getsockopt(struct sock *sk, int level, int optname, 1766 - char __user *optval, int __user *optlen) 1767 - { 1768 - int err; 1769 - 1770 - if (optname == MCAST_MSFILTER) { 1771 - const int size0 = offsetof(struct compat_group_filter, gf_slist); 1772 - struct compat_group_filter __user *p = (void __user *)optval; 1773 - struct compat_group_filter gf32; 1774 - struct group_filter gf; 1775 - int ulen, err; 1776 - int num; 1777 - 1778 - if (level != SOL_IP) 1779 - return -EOPNOTSUPP; 1780 - 1781 - if (get_user(ulen, optlen)) 1782 - return -EFAULT; 1783 - 1784 - if (ulen < size0) 1785 - return -EINVAL; 1786 - 1787 - if (copy_from_user(&gf32, p, size0)) 1788 - return -EFAULT; 1789 - 1790 - gf.gf_interface = gf32.gf_interface; 1791 - gf.gf_fmode = gf32.gf_fmode; 1792 - num = gf.gf_numsrc = gf32.gf_numsrc; 1793 - gf.gf_group = gf32.gf_group; 1794 - 1795 - rtnl_lock(); 1796 - lock_sock(sk); 1797 - err = ip_mc_gsfget(sk, &gf, p->gf_slist); 1798 - release_sock(sk); 1799 - rtnl_unlock(); 1800 - if (err) 1801 - return err; 1802 - if (gf.gf_numsrc < num) 1803 - num = gf.gf_numsrc; 1804 - ulen = GROUP_FILTER_SIZE(num) - (sizeof(gf) - sizeof(gf32)); 1805 - if (put_user(ulen, optlen) || 1806 - put_user(gf.gf_fmode, &p->gf_fmode) || 1807 - put_user(gf.gf_numsrc, &p->gf_numsrc)) 1808 - return -EFAULT; 1809 - return 0; 1810 - } 1811 - 1812 - err = do_ip_getsockopt(sk, level, optname, optval, optlen, 1813 - MSG_CMSG_COMPAT); 1814 - 1815 - #if IS_ENABLED(CONFIG_BPFILTER_UMH) 1816 - if (optname >= BPFILTER_IPT_SO_GET_INFO && 1817 - optname < BPFILTER_IPT_GET_MAX) 1818 - err = bpfilter_ip_get_sockopt(sk, optname, optval, optlen); 1819 - #endif 1820 - #ifdef CONFIG_NETFILTER 1821 - /* we need to exclude all possible ENOPROTOOPTs except default case */ 1822 - if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS && 1823 - !ip_mroute_opt(optname)) { 1824 - int len; 1825 - 1826 - if (get_user(len, optlen)) 1827 - return -EFAULT; 1828 - 1829 - err = compat_nf_getsockopt(sk, PF_INET, optname, optval, &len); 1830 - if (err >= 0) 1831 - err = put_user(len, optlen); 1832 - return err; 1833 - } 1834 - #endif 1835 - return err; 1836 - } 1837 - EXPORT_SYMBOL(compat_ip_getsockopt); 1838 - #endif
+20 -64
net/ipv4/netfilter/arp_tables.c
··· 787 787 } 788 788 #endif 789 789 790 - static int get_info(struct net *net, void __user *user, 791 - const int *len, int compat) 790 + static int get_info(struct net *net, void __user *user, const int *len) 792 791 { 793 792 char name[XT_TABLE_MAXNAMELEN]; 794 793 struct xt_table *t; ··· 801 802 802 803 name[XT_TABLE_MAXNAMELEN-1] = '\0'; 803 804 #ifdef CONFIG_COMPAT 804 - if (compat) 805 + if (in_compat_syscall()) 805 806 xt_compat_lock(NFPROTO_ARP); 806 807 #endif 807 808 t = xt_request_find_table_lock(net, NFPROTO_ARP, name); ··· 811 812 #ifdef CONFIG_COMPAT 812 813 struct xt_table_info tmp; 813 814 814 - if (compat) { 815 + if (in_compat_syscall()) { 815 816 ret = compat_table_info(private, &tmp); 816 817 xt_compat_flush_offsets(NFPROTO_ARP); 817 818 private = &tmp; ··· 836 837 } else 837 838 ret = PTR_ERR(t); 838 839 #ifdef CONFIG_COMPAT 839 - if (compat) 840 + if (in_compat_syscall()) 840 841 xt_compat_unlock(NFPROTO_ARP); 841 842 #endif 842 843 return ret; ··· 997 998 } 998 999 999 1000 static int do_add_counters(struct net *net, const void __user *user, 1000 - unsigned int len, int compat) 1001 + unsigned int len) 1001 1002 { 1002 1003 unsigned int i; 1003 1004 struct xt_counters_info tmp; ··· 1008 1009 struct arpt_entry *iter; 1009 1010 unsigned int addend; 1010 1011 1011 - paddc = xt_copy_counters_from_user(user, len, &tmp, compat); 1012 + paddc = xt_copy_counters_from_user(user, len, &tmp); 1012 1013 if (IS_ERR(paddc)) 1013 1014 return PTR_ERR(paddc); 1014 1015 ··· 1293 1294 return ret; 1294 1295 } 1295 1296 1296 - static int compat_do_arpt_set_ctl(struct sock *sk, int cmd, void __user *user, 1297 - unsigned int len) 1298 - { 1299 - int ret; 1300 - 1301 - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 1302 - return -EPERM; 1303 - 1304 - switch (cmd) { 1305 - case ARPT_SO_SET_REPLACE: 1306 - ret = compat_do_replace(sock_net(sk), user, len); 1307 - break; 1308 - 1309 - case ARPT_SO_SET_ADD_COUNTERS: 1310 - ret = do_add_counters(sock_net(sk), user, len, 1); 1311 - break; 1312 - 1313 - default: 1314 - ret = -EINVAL; 1315 - } 1316 - 1317 - return ret; 1318 - } 1319 - 1320 1297 static int compat_copy_entry_to_user(struct arpt_entry *e, void __user **dstptr, 1321 1298 compat_uint_t *size, 1322 1299 struct xt_counters *counters, ··· 1400 1425 xt_compat_unlock(NFPROTO_ARP); 1401 1426 return ret; 1402 1427 } 1403 - 1404 - static int do_arpt_get_ctl(struct sock *, int, void __user *, int *); 1405 - 1406 - static int compat_do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user, 1407 - int *len) 1408 - { 1409 - int ret; 1410 - 1411 - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 1412 - return -EPERM; 1413 - 1414 - switch (cmd) { 1415 - case ARPT_SO_GET_INFO: 1416 - ret = get_info(sock_net(sk), user, len, 1); 1417 - break; 1418 - case ARPT_SO_GET_ENTRIES: 1419 - ret = compat_get_entries(sock_net(sk), user, len); 1420 - break; 1421 - default: 1422 - ret = do_arpt_get_ctl(sk, cmd, user, len); 1423 - } 1424 - return ret; 1425 - } 1426 1428 #endif 1427 1429 1428 1430 static int do_arpt_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) ··· 1411 1459 1412 1460 switch (cmd) { 1413 1461 case ARPT_SO_SET_REPLACE: 1414 - ret = do_replace(sock_net(sk), user, len); 1462 + #ifdef CONFIG_COMPAT 1463 + if (in_compat_syscall()) 1464 + ret = compat_do_replace(sock_net(sk), user, len); 1465 + else 1466 + #endif 1467 + ret = do_replace(sock_net(sk), user, len); 1415 1468 break; 1416 1469 1417 1470 case ARPT_SO_SET_ADD_COUNTERS: 1418 - ret = do_add_counters(sock_net(sk), user, len, 0); 1471 + ret = do_add_counters(sock_net(sk), user, len); 1419 1472 break; 1420 1473 1421 1474 default: ··· 1439 1482 1440 1483 switch (cmd) { 1441 1484 case ARPT_SO_GET_INFO: 1442 - ret = get_info(sock_net(sk), user, len, 0); 1485 + ret = get_info(sock_net(sk), user, len); 1443 1486 break; 1444 1487 1445 1488 case ARPT_SO_GET_ENTRIES: 1446 - ret = get_entries(sock_net(sk), user, len); 1489 + #ifdef CONFIG_COMPAT 1490 + if (in_compat_syscall()) 1491 + ret = compat_get_entries(sock_net(sk), user, len); 1492 + else 1493 + #endif 1494 + ret = get_entries(sock_net(sk), user, len); 1447 1495 break; 1448 1496 1449 1497 case ARPT_SO_GET_REVISION_TARGET: { ··· 1572 1610 .set_optmin = ARPT_BASE_CTL, 1573 1611 .set_optmax = ARPT_SO_SET_MAX+1, 1574 1612 .set = do_arpt_set_ctl, 1575 - #ifdef CONFIG_COMPAT 1576 - .compat_set = compat_do_arpt_set_ctl, 1577 - #endif 1578 1613 .get_optmin = ARPT_BASE_CTL, 1579 1614 .get_optmax = ARPT_SO_GET_MAX+1, 1580 1615 .get = do_arpt_get_ctl, 1581 - #ifdef CONFIG_COMPAT 1582 - .compat_get = compat_do_arpt_get_ctl, 1583 - #endif 1584 1616 .owner = THIS_MODULE, 1585 1617 }; 1586 1618
+20 -65
net/ipv4/netfilter/ip_tables.c
··· 944 944 } 945 945 #endif 946 946 947 - static int get_info(struct net *net, void __user *user, 948 - const int *len, int compat) 947 + static int get_info(struct net *net, void __user *user, const int *len) 949 948 { 950 949 char name[XT_TABLE_MAXNAMELEN]; 951 950 struct xt_table *t; ··· 958 959 959 960 name[XT_TABLE_MAXNAMELEN-1] = '\0'; 960 961 #ifdef CONFIG_COMPAT 961 - if (compat) 962 + if (in_compat_syscall()) 962 963 xt_compat_lock(AF_INET); 963 964 #endif 964 965 t = xt_request_find_table_lock(net, AF_INET, name); ··· 968 969 #ifdef CONFIG_COMPAT 969 970 struct xt_table_info tmp; 970 971 971 - if (compat) { 972 + if (in_compat_syscall()) { 972 973 ret = compat_table_info(private, &tmp); 973 974 xt_compat_flush_offsets(AF_INET); 974 975 private = &tmp; ··· 994 995 } else 995 996 ret = PTR_ERR(t); 996 997 #ifdef CONFIG_COMPAT 997 - if (compat) 998 + if (in_compat_syscall()) 998 999 xt_compat_unlock(AF_INET); 999 1000 #endif 1000 1001 return ret; ··· 1152 1153 1153 1154 static int 1154 1155 do_add_counters(struct net *net, const void __user *user, 1155 - unsigned int len, int compat) 1156 + unsigned int len) 1156 1157 { 1157 1158 unsigned int i; 1158 1159 struct xt_counters_info tmp; ··· 1163 1164 struct ipt_entry *iter; 1164 1165 unsigned int addend; 1165 1166 1166 - paddc = xt_copy_counters_from_user(user, len, &tmp, compat); 1167 + paddc = xt_copy_counters_from_user(user, len, &tmp); 1167 1168 if (IS_ERR(paddc)) 1168 1169 return PTR_ERR(paddc); 1169 1170 ··· 1533 1534 return ret; 1534 1535 } 1535 1536 1536 - static int 1537 - compat_do_ipt_set_ctl(struct sock *sk, int cmd, void __user *user, 1538 - unsigned int len) 1539 - { 1540 - int ret; 1541 - 1542 - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 1543 - return -EPERM; 1544 - 1545 - switch (cmd) { 1546 - case IPT_SO_SET_REPLACE: 1547 - ret = compat_do_replace(sock_net(sk), user, len); 1548 - break; 1549 - 1550 - case IPT_SO_SET_ADD_COUNTERS: 1551 - ret = do_add_counters(sock_net(sk), user, len, 1); 1552 - break; 1553 - 1554 - default: 1555 - ret = -EINVAL; 1556 - } 1557 - 1558 - return ret; 1559 - } 1560 - 1561 1537 struct compat_ipt_get_entries { 1562 1538 char name[XT_TABLE_MAXNAMELEN]; 1563 1539 compat_uint_t size; ··· 1608 1634 xt_compat_unlock(AF_INET); 1609 1635 return ret; 1610 1636 } 1611 - 1612 - static int do_ipt_get_ctl(struct sock *, int, void __user *, int *); 1613 - 1614 - static int 1615 - compat_do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) 1616 - { 1617 - int ret; 1618 - 1619 - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 1620 - return -EPERM; 1621 - 1622 - switch (cmd) { 1623 - case IPT_SO_GET_INFO: 1624 - ret = get_info(sock_net(sk), user, len, 1); 1625 - break; 1626 - case IPT_SO_GET_ENTRIES: 1627 - ret = compat_get_entries(sock_net(sk), user, len); 1628 - break; 1629 - default: 1630 - ret = do_ipt_get_ctl(sk, cmd, user, len); 1631 - } 1632 - return ret; 1633 - } 1634 1637 #endif 1635 1638 1636 1639 static int ··· 1620 1669 1621 1670 switch (cmd) { 1622 1671 case IPT_SO_SET_REPLACE: 1623 - ret = do_replace(sock_net(sk), user, len); 1672 + #ifdef CONFIG_COMPAT 1673 + if (in_compat_syscall()) 1674 + ret = compat_do_replace(sock_net(sk), user, len); 1675 + else 1676 + #endif 1677 + ret = do_replace(sock_net(sk), user, len); 1624 1678 break; 1625 1679 1626 1680 case IPT_SO_SET_ADD_COUNTERS: 1627 - ret = do_add_counters(sock_net(sk), user, len, 0); 1681 + ret = do_add_counters(sock_net(sk), user, len); 1628 1682 break; 1629 1683 1630 1684 default: ··· 1649 1693 1650 1694 switch (cmd) { 1651 1695 case IPT_SO_GET_INFO: 1652 - ret = get_info(sock_net(sk), user, len, 0); 1696 + ret = get_info(sock_net(sk), user, len); 1653 1697 break; 1654 1698 1655 1699 case IPT_SO_GET_ENTRIES: 1656 - ret = get_entries(sock_net(sk), user, len); 1700 + #ifdef CONFIG_COMPAT 1701 + if (in_compat_syscall()) 1702 + ret = compat_get_entries(sock_net(sk), user, len); 1703 + else 1704 + #endif 1705 + ret = get_entries(sock_net(sk), user, len); 1657 1706 break; 1658 1707 1659 1708 case IPT_SO_GET_REVISION_MATCH: ··· 1847 1886 .set_optmin = IPT_BASE_CTL, 1848 1887 .set_optmax = IPT_SO_SET_MAX+1, 1849 1888 .set = do_ipt_set_ctl, 1850 - #ifdef CONFIG_COMPAT 1851 - .compat_set = compat_do_ipt_set_ctl, 1852 - #endif 1853 1889 .get_optmin = IPT_BASE_CTL, 1854 1890 .get_optmax = IPT_SO_GET_MAX+1, 1855 1891 .get = do_ipt_get_ctl, 1856 - #ifdef CONFIG_COMPAT 1857 - .compat_get = compat_do_ipt_get_ctl, 1858 - #endif 1859 1892 .owner = THIS_MODULE, 1860 1893 }; 1861 1894
-22
net/ipv4/raw.c
··· 857 857 return do_raw_setsockopt(sk, level, optname, optval, optlen); 858 858 } 859 859 860 - #ifdef CONFIG_COMPAT 861 - static int compat_raw_setsockopt(struct sock *sk, int level, int optname, 862 - char __user *optval, unsigned int optlen) 863 - { 864 - if (level != SOL_RAW) 865 - return compat_ip_setsockopt(sk, level, optname, optval, optlen); 866 - return do_raw_setsockopt(sk, level, optname, optval, optlen); 867 - } 868 - #endif 869 - 870 860 static int do_raw_getsockopt(struct sock *sk, int level, int optname, 871 861 char __user *optval, int __user *optlen) 872 862 { ··· 876 886 return ip_getsockopt(sk, level, optname, optval, optlen); 877 887 return do_raw_getsockopt(sk, level, optname, optval, optlen); 878 888 } 879 - 880 - #ifdef CONFIG_COMPAT 881 - static int compat_raw_getsockopt(struct sock *sk, int level, int optname, 882 - char __user *optval, int __user *optlen) 883 - { 884 - if (level != SOL_RAW) 885 - return compat_ip_getsockopt(sk, level, optname, optval, optlen); 886 - return do_raw_getsockopt(sk, level, optname, optval, optlen); 887 - } 888 - #endif 889 889 890 890 static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) 891 891 { ··· 960 980 .usersize = sizeof_field(struct raw_sock, filter), 961 981 .h.raw_hash = &raw_v4_hashinfo, 962 982 #ifdef CONFIG_COMPAT 963 - .compat_setsockopt = compat_raw_setsockopt, 964 - .compat_getsockopt = compat_raw_getsockopt, 965 983 .compat_ioctl = compat_raw_ioctl, 966 984 #endif 967 985 .diag_destroy = raw_abort,
-24
net/ipv4/tcp.c
··· 3337 3337 } 3338 3338 EXPORT_SYMBOL(tcp_setsockopt); 3339 3339 3340 - #ifdef CONFIG_COMPAT 3341 - int compat_tcp_setsockopt(struct sock *sk, int level, int optname, 3342 - char __user *optval, unsigned int optlen) 3343 - { 3344 - if (level != SOL_TCP) 3345 - return inet_csk_compat_setsockopt(sk, level, optname, 3346 - optval, optlen); 3347 - return do_tcp_setsockopt(sk, level, optname, optval, optlen); 3348 - } 3349 - EXPORT_SYMBOL(compat_tcp_setsockopt); 3350 - #endif 3351 - 3352 3340 static void tcp_get_info_chrono_stats(const struct tcp_sock *tp, 3353 3341 struct tcp_info *info) 3354 3342 { ··· 3883 3895 return do_tcp_getsockopt(sk, level, optname, optval, optlen); 3884 3896 } 3885 3897 EXPORT_SYMBOL(tcp_getsockopt); 3886 - 3887 - #ifdef CONFIG_COMPAT 3888 - int compat_tcp_getsockopt(struct sock *sk, int level, int optname, 3889 - char __user *optval, int __user *optlen) 3890 - { 3891 - if (level != SOL_TCP) 3892 - return inet_csk_compat_getsockopt(sk, level, optname, 3893 - optval, optlen); 3894 - return do_tcp_getsockopt(sk, level, optname, optval, optlen); 3895 - } 3896 - EXPORT_SYMBOL(compat_tcp_getsockopt); 3897 - #endif 3898 3898 3899 3899 #ifdef CONFIG_TCP_MD5SIG 3900 3900 static DEFINE_PER_CPU(struct tcp_md5sig_pool, tcp_md5sig_pool);
-8
net/ipv4/tcp_ipv4.c
··· 2134 2134 .getsockopt = ip_getsockopt, 2135 2135 .addr2sockaddr = inet_csk_addr2sockaddr, 2136 2136 .sockaddr_len = sizeof(struct sockaddr_in), 2137 - #ifdef CONFIG_COMPAT 2138 - .compat_setsockopt = compat_ip_setsockopt, 2139 - .compat_getsockopt = compat_ip_getsockopt, 2140 - #endif 2141 2137 .mtu_reduced = tcp_v4_mtu_reduced, 2142 2138 }; 2143 2139 EXPORT_SYMBOL(ipv4_specific); ··· 2769 2773 .rsk_prot = &tcp_request_sock_ops, 2770 2774 .h.hashinfo = &tcp_hashinfo, 2771 2775 .no_autobind = true, 2772 - #ifdef CONFIG_COMPAT 2773 - .compat_setsockopt = compat_tcp_setsockopt, 2774 - .compat_getsockopt = compat_tcp_getsockopt, 2775 - #endif 2776 2776 .diag_destroy = tcp_abort, 2777 2777 }; 2778 2778 EXPORT_SYMBOL(tcp_prot);
-24
net/ipv4/udp.c
··· 2656 2656 return ip_setsockopt(sk, level, optname, optval, optlen); 2657 2657 } 2658 2658 2659 - #ifdef CONFIG_COMPAT 2660 - int compat_udp_setsockopt(struct sock *sk, int level, int optname, 2661 - char __user *optval, unsigned int optlen) 2662 - { 2663 - if (level == SOL_UDP || level == SOL_UDPLITE) 2664 - return udp_lib_setsockopt(sk, level, optname, optval, optlen, 2665 - udp_push_pending_frames); 2666 - return compat_ip_setsockopt(sk, level, optname, optval, optlen); 2667 - } 2668 - #endif 2669 - 2670 2659 int udp_lib_getsockopt(struct sock *sk, int level, int optname, 2671 2660 char __user *optval, int __user *optlen) 2672 2661 { ··· 2721 2732 return ip_getsockopt(sk, level, optname, optval, optlen); 2722 2733 } 2723 2734 2724 - #ifdef CONFIG_COMPAT 2725 - int compat_udp_getsockopt(struct sock *sk, int level, int optname, 2726 - char __user *optval, int __user *optlen) 2727 - { 2728 - if (level == SOL_UDP || level == SOL_UDPLITE) 2729 - return udp_lib_getsockopt(sk, level, optname, optval, optlen); 2730 - return compat_ip_getsockopt(sk, level, optname, optval, optlen); 2731 - } 2732 - #endif 2733 2735 /** 2734 2736 * udp_poll - wait for a UDP event. 2735 2737 * @file: - file struct ··· 2792 2812 .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min), 2793 2813 .obj_size = sizeof(struct udp_sock), 2794 2814 .h.udp_table = &udp_table, 2795 - #ifdef CONFIG_COMPAT 2796 - .compat_setsockopt = compat_udp_setsockopt, 2797 - .compat_getsockopt = compat_udp_getsockopt, 2798 - #endif 2799 2815 .diag_destroy = udp_abort, 2800 2816 }; 2801 2817 EXPORT_SYMBOL(udp_prot);
-6
net/ipv4/udp_impl.h
··· 17 17 int udp_getsockopt(struct sock *sk, int level, int optname, 18 18 char __user *optval, int __user *optlen); 19 19 20 - #ifdef CONFIG_COMPAT 21 - int compat_udp_setsockopt(struct sock *sk, int level, int optname, 22 - char __user *optval, unsigned int optlen); 23 - int compat_udp_getsockopt(struct sock *sk, int level, int optname, 24 - char __user *optval, int __user *optlen); 25 - #endif 26 20 int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, 27 21 int flags, int *addr_len); 28 22 int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
-4
net/ipv4/udplite.c
··· 56 56 .sysctl_mem = sysctl_udp_mem, 57 57 .obj_size = sizeof(struct udp_sock), 58 58 .h.udp_table = &udplite_table, 59 - #ifdef CONFIG_COMPAT 60 - .compat_setsockopt = compat_udp_setsockopt, 61 - .compat_getsockopt = compat_udp_getsockopt, 62 - #endif 63 59 }; 64 60 EXPORT_SYMBOL(udplite_prot); 65 61
-4
net/ipv6/af_inet6.c
··· 688 688 .peek_len = tcp_peek_len, 689 689 #ifdef CONFIG_COMPAT 690 690 .compat_ioctl = inet6_compat_ioctl, 691 - .compat_setsockopt = compat_sock_common_setsockopt, 692 - .compat_getsockopt = compat_sock_common_getsockopt, 693 691 #endif 694 692 .set_rcvlowat = tcp_set_rcvlowat, 695 693 }; ··· 715 717 .set_peek_off = sk_set_peek_off, 716 718 #ifdef CONFIG_COMPAT 717 719 .compat_ioctl = inet6_compat_ioctl, 718 - .compat_setsockopt = compat_sock_common_setsockopt, 719 - .compat_getsockopt = compat_sock_common_getsockopt, 720 720 #endif 721 721 }; 722 722
+235 -306
net/ipv6/ipv6_sockglue.c
··· 136 136 return false; 137 137 } 138 138 139 - static int do_ipv6_mcast_group_source(struct sock *sk, int optname, 140 - struct group_source_req *greqs) 139 + static int copy_group_source_from_user(struct group_source_req *greqs, 140 + void __user *optval, int optlen) 141 141 { 142 - int omode, add; 142 + if (in_compat_syscall()) { 143 + struct compat_group_source_req gr32; 143 144 144 - if (greqs->gsr_group.ss_family != AF_INET6 || 145 - greqs->gsr_source.ss_family != AF_INET6) 145 + if (optlen < sizeof(gr32)) 146 + return -EINVAL; 147 + if (copy_from_user(&gr32, optval, sizeof(gr32))) 148 + return -EFAULT; 149 + greqs->gsr_interface = gr32.gsr_interface; 150 + greqs->gsr_group = gr32.gsr_group; 151 + greqs->gsr_source = gr32.gsr_source; 152 + } else { 153 + if (optlen < sizeof(*greqs)) 154 + return -EINVAL; 155 + if (copy_from_user(greqs, optval, sizeof(*greqs))) 156 + return -EFAULT; 157 + } 158 + 159 + return 0; 160 + } 161 + 162 + static int do_ipv6_mcast_group_source(struct sock *sk, int optname, 163 + void __user *optval, int optlen) 164 + { 165 + struct group_source_req greqs; 166 + int omode, add; 167 + int ret; 168 + 169 + ret = copy_group_source_from_user(&greqs, optval, optlen); 170 + if (ret) 171 + return ret; 172 + 173 + if (greqs.gsr_group.ss_family != AF_INET6 || 174 + greqs.gsr_source.ss_family != AF_INET6) 146 175 return -EADDRNOTAVAIL; 147 176 148 177 if (optname == MCAST_BLOCK_SOURCE) { ··· 184 155 struct sockaddr_in6 *psin6; 185 156 int retv; 186 157 187 - psin6 = (struct sockaddr_in6 *)&greqs->gsr_group; 188 - retv = ipv6_sock_mc_join_ssm(sk, greqs->gsr_interface, 158 + psin6 = (struct sockaddr_in6 *)&greqs.gsr_group; 159 + retv = ipv6_sock_mc_join_ssm(sk, greqs.gsr_interface, 189 160 &psin6->sin6_addr, 190 161 MCAST_INCLUDE); 191 162 /* prior join w/ different source is ok */ ··· 197 168 omode = MCAST_INCLUDE; 198 169 add = 0; 199 170 } 200 - return ip6_mc_source(add, omode, sk, greqs); 171 + return ip6_mc_source(add, omode, sk, &greqs); 172 + } 173 + 174 + static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval, 175 + int optlen) 176 + { 177 + struct group_filter *gsf; 178 + int ret; 179 + 180 + if (optlen < GROUP_FILTER_SIZE(0)) 181 + return -EINVAL; 182 + if (optlen > sysctl_optmem_max) 183 + return -ENOBUFS; 184 + 185 + gsf = memdup_user(optval, optlen); 186 + if (IS_ERR(gsf)) 187 + return PTR_ERR(gsf); 188 + 189 + /* numsrc >= (4G-140)/128 overflow in 32 bits */ 190 + ret = -ENOBUFS; 191 + if (gsf->gf_numsrc >= 0x1ffffffU || 192 + gsf->gf_numsrc > sysctl_mld_max_msf) 193 + goto out_free_gsf; 194 + 195 + ret = -EINVAL; 196 + if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) 197 + goto out_free_gsf; 198 + 199 + ret = ip6_mc_msfilter(sk, gsf, gsf->gf_slist); 200 + out_free_gsf: 201 + kfree(gsf); 202 + return ret; 203 + } 204 + 205 + static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval, 206 + int optlen) 207 + { 208 + const int size0 = offsetof(struct compat_group_filter, gf_slist); 209 + struct compat_group_filter *gf32; 210 + void *p; 211 + int ret; 212 + int n; 213 + 214 + if (optlen < size0) 215 + return -EINVAL; 216 + if (optlen > sysctl_optmem_max - 4) 217 + return -ENOBUFS; 218 + 219 + p = kmalloc(optlen + 4, GFP_KERNEL); 220 + if (!p) 221 + return -ENOMEM; 222 + 223 + gf32 = p + 4; /* we want ->gf_group and ->gf_slist aligned */ 224 + ret = -EFAULT; 225 + if (copy_from_user(gf32, optval, optlen)) 226 + goto out_free_p; 227 + 228 + /* numsrc >= (4G-140)/128 overflow in 32 bits */ 229 + ret = -ENOBUFS; 230 + n = gf32->gf_numsrc; 231 + if (n >= 0x1ffffffU || n > sysctl_mld_max_msf) 232 + goto out_free_p; 233 + 234 + ret = -EINVAL; 235 + if (offsetof(struct compat_group_filter, gf_slist[n]) > optlen) 236 + goto out_free_p; 237 + 238 + ret = ip6_mc_msfilter(sk, &(struct group_filter){ 239 + .gf_interface = gf32->gf_interface, 240 + .gf_group = gf32->gf_group, 241 + .gf_fmode = gf32->gf_fmode, 242 + .gf_numsrc = gf32->gf_numsrc}, gf32->gf_slist); 243 + 244 + out_free_p: 245 + kfree(p); 246 + return ret; 247 + } 248 + 249 + static int ipv6_mcast_join_leave(struct sock *sk, int optname, 250 + void __user *optval, int optlen) 251 + { 252 + struct sockaddr_in6 *psin6; 253 + struct group_req greq; 254 + 255 + if (optlen < sizeof(greq)) 256 + return -EINVAL; 257 + if (copy_from_user(&greq, optval, sizeof(greq))) 258 + return -EFAULT; 259 + 260 + if (greq.gr_group.ss_family != AF_INET6) 261 + return -EADDRNOTAVAIL; 262 + psin6 = (struct sockaddr_in6 *)&greq.gr_group; 263 + if (optname == MCAST_JOIN_GROUP) 264 + return ipv6_sock_mc_join(sk, greq.gr_interface, 265 + &psin6->sin6_addr); 266 + return ipv6_sock_mc_drop(sk, greq.gr_interface, &psin6->sin6_addr); 267 + } 268 + 269 + static int compat_ipv6_mcast_join_leave(struct sock *sk, int optname, 270 + void __user *optval, int optlen) 271 + { 272 + struct compat_group_req gr32; 273 + struct sockaddr_in6 *psin6; 274 + 275 + if (optlen < sizeof(gr32)) 276 + return -EINVAL; 277 + if (copy_from_user(&gr32, optval, sizeof(gr32))) 278 + return -EFAULT; 279 + 280 + if (gr32.gr_group.ss_family != AF_INET6) 281 + return -EADDRNOTAVAIL; 282 + psin6 = (struct sockaddr_in6 *)&gr32.gr_group; 283 + if (optname == MCAST_JOIN_GROUP) 284 + return ipv6_sock_mc_join(sk, gr32.gr_interface, 285 + &psin6->sin6_addr); 286 + return ipv6_sock_mc_drop(sk, gr32.gr_interface, &psin6->sin6_addr); 201 287 } 202 288 203 289 static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, ··· 866 722 867 723 case MCAST_JOIN_GROUP: 868 724 case MCAST_LEAVE_GROUP: 869 - { 870 - struct group_req greq; 871 - struct sockaddr_in6 *psin6; 872 - 873 - if (optlen < sizeof(struct group_req)) 874 - goto e_inval; 875 - 876 - retv = -EFAULT; 877 - if (copy_from_user(&greq, optval, sizeof(struct group_req))) 878 - break; 879 - if (greq.gr_group.ss_family != AF_INET6) { 880 - retv = -EADDRNOTAVAIL; 881 - break; 882 - } 883 - psin6 = (struct sockaddr_in6 *)&greq.gr_group; 884 - if (optname == MCAST_JOIN_GROUP) 885 - retv = ipv6_sock_mc_join(sk, greq.gr_interface, 886 - &psin6->sin6_addr); 725 + if (in_compat_syscall()) 726 + retv = compat_ipv6_mcast_join_leave(sk, optname, optval, 727 + optlen); 887 728 else 888 - retv = ipv6_sock_mc_drop(sk, greq.gr_interface, 889 - &psin6->sin6_addr); 729 + retv = ipv6_mcast_join_leave(sk, optname, optval, 730 + optlen); 890 731 break; 891 - } 892 732 case MCAST_JOIN_SOURCE_GROUP: 893 733 case MCAST_LEAVE_SOURCE_GROUP: 894 734 case MCAST_BLOCK_SOURCE: 895 735 case MCAST_UNBLOCK_SOURCE: 896 - { 897 - struct group_source_req greqs; 898 - 899 - if (optlen < sizeof(struct group_source_req)) 900 - goto e_inval; 901 - if (copy_from_user(&greqs, optval, sizeof(greqs))) { 902 - retv = -EFAULT; 903 - break; 904 - } 905 - retv = do_ipv6_mcast_group_source(sk, optname, &greqs); 736 + retv = do_ipv6_mcast_group_source(sk, optname, optval, optlen); 906 737 break; 907 - } 908 738 case MCAST_MSFILTER: 909 - { 910 - struct group_filter *gsf; 911 - 912 - if (optlen < GROUP_FILTER_SIZE(0)) 913 - goto e_inval; 914 - if (optlen > sysctl_optmem_max) { 915 - retv = -ENOBUFS; 916 - break; 917 - } 918 - gsf = memdup_user(optval, optlen); 919 - if (IS_ERR(gsf)) { 920 - retv = PTR_ERR(gsf); 921 - break; 922 - } 923 - /* numsrc >= (4G-140)/128 overflow in 32 bits */ 924 - if (gsf->gf_numsrc >= 0x1ffffffU || 925 - gsf->gf_numsrc > sysctl_mld_max_msf) { 926 - kfree(gsf); 927 - retv = -ENOBUFS; 928 - break; 929 - } 930 - if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) { 931 - kfree(gsf); 932 - retv = -EINVAL; 933 - break; 934 - } 935 - retv = ip6_mc_msfilter(sk, gsf, gsf->gf_slist); 936 - kfree(gsf); 937 - 739 + if (in_compat_syscall()) 740 + retv = compat_ipv6_set_mcast_msfilter(sk, optval, 741 + optlen); 742 + else 743 + retv = ipv6_set_mcast_msfilter(sk, optval, optlen); 938 744 break; 939 - } 940 745 case IPV6_ROUTER_ALERT: 941 746 if (optlen < sizeof(int)) 942 747 goto e_inval; ··· 1001 908 } 1002 909 EXPORT_SYMBOL(ipv6_setsockopt); 1003 910 1004 - #ifdef CONFIG_COMPAT 1005 - int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, 1006 - char __user *optval, unsigned int optlen) 1007 - { 1008 - int err; 1009 - 1010 - if (level == SOL_IP && sk->sk_type != SOCK_RAW) { 1011 - if (udp_prot.compat_setsockopt != NULL) 1012 - return udp_prot.compat_setsockopt(sk, level, optname, 1013 - optval, optlen); 1014 - return udp_prot.setsockopt(sk, level, optname, optval, optlen); 1015 - } 1016 - 1017 - if (level != SOL_IPV6) 1018 - return -ENOPROTOOPT; 1019 - 1020 - switch (optname) { 1021 - case MCAST_JOIN_GROUP: 1022 - case MCAST_LEAVE_GROUP: 1023 - { 1024 - struct compat_group_req __user *gr32 = (void __user *)optval; 1025 - struct group_req greq; 1026 - struct sockaddr_in6 *psin6 = (struct sockaddr_in6 *)&greq.gr_group; 1027 - 1028 - if (optlen < sizeof(struct compat_group_req)) 1029 - return -EINVAL; 1030 - 1031 - if (get_user(greq.gr_interface, &gr32->gr_interface) || 1032 - copy_from_user(&greq.gr_group, &gr32->gr_group, 1033 - sizeof(greq.gr_group))) 1034 - return -EFAULT; 1035 - 1036 - if (greq.gr_group.ss_family != AF_INET6) 1037 - return -EADDRNOTAVAIL; 1038 - 1039 - rtnl_lock(); 1040 - lock_sock(sk); 1041 - if (optname == MCAST_JOIN_GROUP) 1042 - err = ipv6_sock_mc_join(sk, greq.gr_interface, 1043 - &psin6->sin6_addr); 1044 - else 1045 - err = ipv6_sock_mc_drop(sk, greq.gr_interface, 1046 - &psin6->sin6_addr); 1047 - release_sock(sk); 1048 - rtnl_unlock(); 1049 - return err; 1050 - } 1051 - case MCAST_JOIN_SOURCE_GROUP: 1052 - case MCAST_LEAVE_SOURCE_GROUP: 1053 - case MCAST_BLOCK_SOURCE: 1054 - case MCAST_UNBLOCK_SOURCE: 1055 - { 1056 - struct compat_group_source_req __user *gsr32 = (void __user *)optval; 1057 - struct group_source_req greqs; 1058 - 1059 - if (optlen < sizeof(struct compat_group_source_req)) 1060 - return -EINVAL; 1061 - 1062 - if (get_user(greqs.gsr_interface, &gsr32->gsr_interface) || 1063 - copy_from_user(&greqs.gsr_group, &gsr32->gsr_group, 1064 - sizeof(greqs.gsr_group)) || 1065 - copy_from_user(&greqs.gsr_source, &gsr32->gsr_source, 1066 - sizeof(greqs.gsr_source))) 1067 - return -EFAULT; 1068 - 1069 - rtnl_lock(); 1070 - lock_sock(sk); 1071 - err = do_ipv6_mcast_group_source(sk, optname, &greqs); 1072 - release_sock(sk); 1073 - rtnl_unlock(); 1074 - return err; 1075 - } 1076 - case MCAST_MSFILTER: 1077 - { 1078 - const int size0 = offsetof(struct compat_group_filter, gf_slist); 1079 - struct compat_group_filter *gf32; 1080 - void *p; 1081 - int n; 1082 - 1083 - if (optlen < size0) 1084 - return -EINVAL; 1085 - if (optlen > sysctl_optmem_max - 4) 1086 - return -ENOBUFS; 1087 - 1088 - p = kmalloc(optlen + 4, GFP_KERNEL); 1089 - if (!p) 1090 - return -ENOMEM; 1091 - 1092 - gf32 = p + 4; /* we want ->gf_group and ->gf_slist aligned */ 1093 - if (copy_from_user(gf32, optval, optlen)) { 1094 - err = -EFAULT; 1095 - goto mc_msf_out; 1096 - } 1097 - 1098 - n = gf32->gf_numsrc; 1099 - /* numsrc >= (4G-140)/128 overflow in 32 bits */ 1100 - if (n >= 0x1ffffffU || 1101 - n > sysctl_mld_max_msf) { 1102 - err = -ENOBUFS; 1103 - goto mc_msf_out; 1104 - } 1105 - if (offsetof(struct compat_group_filter, gf_slist[n]) > optlen) { 1106 - err = -EINVAL; 1107 - goto mc_msf_out; 1108 - } 1109 - 1110 - rtnl_lock(); 1111 - lock_sock(sk); 1112 - err = ip6_mc_msfilter(sk, &(struct group_filter){ 1113 - .gf_interface = gf32->gf_interface, 1114 - .gf_group = gf32->gf_group, 1115 - .gf_fmode = gf32->gf_fmode, 1116 - .gf_numsrc = gf32->gf_numsrc}, gf32->gf_slist); 1117 - release_sock(sk); 1118 - rtnl_unlock(); 1119 - mc_msf_out: 1120 - kfree(p); 1121 - return err; 1122 - } 1123 - } 1124 - 1125 - err = do_ipv6_setsockopt(sk, level, optname, optval, optlen); 1126 - #ifdef CONFIG_NETFILTER 1127 - /* we need to exclude all possible ENOPROTOOPTs except default case */ 1128 - if (err == -ENOPROTOOPT && optname != IPV6_IPSEC_POLICY && 1129 - optname != IPV6_XFRM_POLICY) 1130 - err = compat_nf_setsockopt(sk, PF_INET6, optname, optval, 1131 - optlen); 1132 - #endif 1133 - return err; 1134 - } 1135 - EXPORT_SYMBOL(compat_ipv6_setsockopt); 1136 - #endif 1137 - 1138 911 static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt, 1139 912 int optname, char __user *optval, int len) 1140 913 { ··· 1035 1076 return len; 1036 1077 } 1037 1078 1079 + static int ipv6_get_msfilter(struct sock *sk, void __user *optval, 1080 + int __user *optlen, int len) 1081 + { 1082 + const int size0 = offsetof(struct group_filter, gf_slist); 1083 + struct group_filter __user *p = optval; 1084 + struct group_filter gsf; 1085 + int num; 1086 + int err; 1087 + 1088 + if (len < size0) 1089 + return -EINVAL; 1090 + if (copy_from_user(&gsf, p, size0)) 1091 + return -EFAULT; 1092 + if (gsf.gf_group.ss_family != AF_INET6) 1093 + return -EADDRNOTAVAIL; 1094 + num = gsf.gf_numsrc; 1095 + lock_sock(sk); 1096 + err = ip6_mc_msfget(sk, &gsf, p->gf_slist); 1097 + if (!err) { 1098 + if (num > gsf.gf_numsrc) 1099 + num = gsf.gf_numsrc; 1100 + if (put_user(GROUP_FILTER_SIZE(num), optlen) || 1101 + copy_to_user(p, &gsf, size0)) 1102 + err = -EFAULT; 1103 + } 1104 + release_sock(sk); 1105 + return err; 1106 + } 1107 + 1108 + static int compat_ipv6_get_msfilter(struct sock *sk, void __user *optval, 1109 + int __user *optlen) 1110 + { 1111 + const int size0 = offsetof(struct compat_group_filter, gf_slist); 1112 + struct compat_group_filter __user *p = optval; 1113 + struct compat_group_filter gf32; 1114 + struct group_filter gf; 1115 + int len, err; 1116 + int num; 1117 + 1118 + if (get_user(len, optlen)) 1119 + return -EFAULT; 1120 + if (len < size0) 1121 + return -EINVAL; 1122 + 1123 + if (copy_from_user(&gf32, p, size0)) 1124 + return -EFAULT; 1125 + gf.gf_interface = gf32.gf_interface; 1126 + gf.gf_fmode = gf32.gf_fmode; 1127 + num = gf.gf_numsrc = gf32.gf_numsrc; 1128 + gf.gf_group = gf32.gf_group; 1129 + 1130 + if (gf.gf_group.ss_family != AF_INET6) 1131 + return -EADDRNOTAVAIL; 1132 + 1133 + lock_sock(sk); 1134 + err = ip6_mc_msfget(sk, &gf, p->gf_slist); 1135 + release_sock(sk); 1136 + if (err) 1137 + return err; 1138 + if (num > gf.gf_numsrc) 1139 + num = gf.gf_numsrc; 1140 + len = GROUP_FILTER_SIZE(num) - (sizeof(gf)-sizeof(gf32)); 1141 + if (put_user(len, optlen) || 1142 + put_user(gf.gf_fmode, &p->gf_fmode) || 1143 + put_user(gf.gf_numsrc, &p->gf_numsrc)) 1144 + return -EFAULT; 1145 + return 0; 1146 + } 1147 + 1038 1148 static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, 1039 1149 char __user *optval, int __user *optlen, unsigned int flags) 1040 1150 { ··· 1127 1099 val = sk->sk_family; 1128 1100 break; 1129 1101 case MCAST_MSFILTER: 1130 - { 1131 - struct group_filter __user *p = (void __user *)optval; 1132 - struct group_filter gsf; 1133 - const int size0 = offsetof(struct group_filter, gf_slist); 1134 - int num; 1135 - int err; 1136 - 1137 - if (len < size0) 1138 - return -EINVAL; 1139 - if (copy_from_user(&gsf, p, size0)) 1140 - return -EFAULT; 1141 - if (gsf.gf_group.ss_family != AF_INET6) 1142 - return -EADDRNOTAVAIL; 1143 - num = gsf.gf_numsrc; 1144 - lock_sock(sk); 1145 - err = ip6_mc_msfget(sk, &gsf, p->gf_slist); 1146 - if (!err) { 1147 - if (num > gsf.gf_numsrc) 1148 - num = gsf.gf_numsrc; 1149 - if (put_user(GROUP_FILTER_SIZE(num), optlen) || 1150 - copy_to_user(p, &gsf, size0)) 1151 - err = -EFAULT; 1152 - } 1153 - release_sock(sk); 1154 - return err; 1155 - } 1156 - 1102 + if (in_compat_syscall()) 1103 + return compat_ipv6_get_msfilter(sk, optval, optlen); 1104 + return ipv6_get_msfilter(sk, optval, optlen, len); 1157 1105 case IPV6_2292PKTOPTIONS: 1158 1106 { 1159 1107 struct msghdr msg; ··· 1477 1473 return err; 1478 1474 } 1479 1475 EXPORT_SYMBOL(ipv6_getsockopt); 1480 - 1481 - #ifdef CONFIG_COMPAT 1482 - int compat_ipv6_getsockopt(struct sock *sk, int level, int optname, 1483 - char __user *optval, int __user *optlen) 1484 - { 1485 - int err; 1486 - 1487 - if (level == SOL_IP && sk->sk_type != SOCK_RAW) { 1488 - if (udp_prot.compat_getsockopt != NULL) 1489 - return udp_prot.compat_getsockopt(sk, level, optname, 1490 - optval, optlen); 1491 - return udp_prot.getsockopt(sk, level, optname, optval, optlen); 1492 - } 1493 - 1494 - if (level != SOL_IPV6) 1495 - return -ENOPROTOOPT; 1496 - 1497 - if (optname == MCAST_MSFILTER) { 1498 - const int size0 = offsetof(struct compat_group_filter, gf_slist); 1499 - struct compat_group_filter __user *p = (void __user *)optval; 1500 - struct compat_group_filter gf32; 1501 - struct group_filter gf; 1502 - int ulen, err; 1503 - int num; 1504 - 1505 - if (get_user(ulen, optlen)) 1506 - return -EFAULT; 1507 - 1508 - if (ulen < size0) 1509 - return -EINVAL; 1510 - 1511 - if (copy_from_user(&gf32, p, size0)) 1512 - return -EFAULT; 1513 - 1514 - gf.gf_interface = gf32.gf_interface; 1515 - gf.gf_fmode = gf32.gf_fmode; 1516 - num = gf.gf_numsrc = gf32.gf_numsrc; 1517 - gf.gf_group = gf32.gf_group; 1518 - 1519 - if (gf.gf_group.ss_family != AF_INET6) 1520 - return -EADDRNOTAVAIL; 1521 - lock_sock(sk); 1522 - err = ip6_mc_msfget(sk, &gf, p->gf_slist); 1523 - release_sock(sk); 1524 - if (err) 1525 - return err; 1526 - if (num > gf.gf_numsrc) 1527 - num = gf.gf_numsrc; 1528 - ulen = GROUP_FILTER_SIZE(num) - (sizeof(gf)-sizeof(gf32)); 1529 - if (put_user(ulen, optlen) || 1530 - put_user(gf.gf_fmode, &p->gf_fmode) || 1531 - put_user(gf.gf_numsrc, &p->gf_numsrc)) 1532 - return -EFAULT; 1533 - return 0; 1534 - } 1535 - 1536 - err = do_ipv6_getsockopt(sk, level, optname, optval, optlen, 1537 - MSG_CMSG_COMPAT); 1538 - #ifdef CONFIG_NETFILTER 1539 - /* we need to exclude all possible ENOPROTOOPTs except default case */ 1540 - if (err == -ENOPROTOOPT && optname != IPV6_2292PKTOPTIONS) { 1541 - int len; 1542 - 1543 - if (get_user(len, optlen)) 1544 - return -EFAULT; 1545 - 1546 - err = compat_nf_getsockopt(sk, PF_INET6, optname, optval, &len); 1547 - if (err >= 0) 1548 - err = put_user(len, optlen); 1549 - } 1550 - #endif 1551 - return err; 1552 - } 1553 - EXPORT_SYMBOL(compat_ipv6_getsockopt); 1554 - #endif
+20 -66
net/ipv6/netfilter/ip6_tables.c
··· 960 960 } 961 961 #endif 962 962 963 - static int get_info(struct net *net, void __user *user, 964 - const int *len, int compat) 963 + static int get_info(struct net *net, void __user *user, const int *len) 965 964 { 966 965 char name[XT_TABLE_MAXNAMELEN]; 967 966 struct xt_table *t; ··· 974 975 975 976 name[XT_TABLE_MAXNAMELEN-1] = '\0'; 976 977 #ifdef CONFIG_COMPAT 977 - if (compat) 978 + if (in_compat_syscall()) 978 979 xt_compat_lock(AF_INET6); 979 980 #endif 980 981 t = xt_request_find_table_lock(net, AF_INET6, name); ··· 984 985 #ifdef CONFIG_COMPAT 985 986 struct xt_table_info tmp; 986 987 987 - if (compat) { 988 + if (in_compat_syscall()) { 988 989 ret = compat_table_info(private, &tmp); 989 990 xt_compat_flush_offsets(AF_INET6); 990 991 private = &tmp; ··· 1010 1011 } else 1011 1012 ret = PTR_ERR(t); 1012 1013 #ifdef CONFIG_COMPAT 1013 - if (compat) 1014 + if (in_compat_syscall()) 1014 1015 xt_compat_unlock(AF_INET6); 1015 1016 #endif 1016 1017 return ret; ··· 1168 1169 } 1169 1170 1170 1171 static int 1171 - do_add_counters(struct net *net, const void __user *user, unsigned int len, 1172 - int compat) 1172 + do_add_counters(struct net *net, const void __user *user, unsigned int len) 1173 1173 { 1174 1174 unsigned int i; 1175 1175 struct xt_counters_info tmp; ··· 1179 1181 struct ip6t_entry *iter; 1180 1182 unsigned int addend; 1181 1183 1182 - paddc = xt_copy_counters_from_user(user, len, &tmp, compat); 1184 + paddc = xt_copy_counters_from_user(user, len, &tmp); 1183 1185 if (IS_ERR(paddc)) 1184 1186 return PTR_ERR(paddc); 1185 1187 t = xt_find_table_lock(net, AF_INET6, tmp.name); ··· 1541 1543 return ret; 1542 1544 } 1543 1545 1544 - static int 1545 - compat_do_ip6t_set_ctl(struct sock *sk, int cmd, void __user *user, 1546 - unsigned int len) 1547 - { 1548 - int ret; 1549 - 1550 - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 1551 - return -EPERM; 1552 - 1553 - switch (cmd) { 1554 - case IP6T_SO_SET_REPLACE: 1555 - ret = compat_do_replace(sock_net(sk), user, len); 1556 - break; 1557 - 1558 - case IP6T_SO_SET_ADD_COUNTERS: 1559 - ret = do_add_counters(sock_net(sk), user, len, 1); 1560 - break; 1561 - 1562 - default: 1563 - ret = -EINVAL; 1564 - } 1565 - 1566 - return ret; 1567 - } 1568 - 1569 1546 struct compat_ip6t_get_entries { 1570 1547 char name[XT_TABLE_MAXNAMELEN]; 1571 1548 compat_uint_t size; ··· 1616 1643 xt_compat_unlock(AF_INET6); 1617 1644 return ret; 1618 1645 } 1619 - 1620 - static int do_ip6t_get_ctl(struct sock *, int, void __user *, int *); 1621 - 1622 - static int 1623 - compat_do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) 1624 - { 1625 - int ret; 1626 - 1627 - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 1628 - return -EPERM; 1629 - 1630 - switch (cmd) { 1631 - case IP6T_SO_GET_INFO: 1632 - ret = get_info(sock_net(sk), user, len, 1); 1633 - break; 1634 - case IP6T_SO_GET_ENTRIES: 1635 - ret = compat_get_entries(sock_net(sk), user, len); 1636 - break; 1637 - default: 1638 - ret = do_ip6t_get_ctl(sk, cmd, user, len); 1639 - } 1640 - return ret; 1641 - } 1642 1646 #endif 1643 1647 1644 1648 static int ··· 1628 1678 1629 1679 switch (cmd) { 1630 1680 case IP6T_SO_SET_REPLACE: 1631 - ret = do_replace(sock_net(sk), user, len); 1681 + #ifdef CONFIG_COMPAT 1682 + if (in_compat_syscall()) 1683 + ret = compat_do_replace(sock_net(sk), user, len); 1684 + else 1685 + #endif 1686 + ret = do_replace(sock_net(sk), user, len); 1632 1687 break; 1633 1688 1634 1689 case IP6T_SO_SET_ADD_COUNTERS: 1635 - ret = do_add_counters(sock_net(sk), user, len, 0); 1690 + ret = do_add_counters(sock_net(sk), user, len); 1636 1691 break; 1637 1692 1638 1693 default: ··· 1657 1702 1658 1703 switch (cmd) { 1659 1704 case IP6T_SO_GET_INFO: 1660 - ret = get_info(sock_net(sk), user, len, 0); 1705 + ret = get_info(sock_net(sk), user, len); 1661 1706 break; 1662 1707 1663 1708 case IP6T_SO_GET_ENTRIES: 1664 - ret = get_entries(sock_net(sk), user, len); 1709 + #ifdef CONFIG_COMPAT 1710 + if (in_compat_syscall()) 1711 + ret = compat_get_entries(sock_net(sk), user, len); 1712 + else 1713 + #endif 1714 + ret = get_entries(sock_net(sk), user, len); 1665 1715 break; 1666 1716 1667 1717 case IP6T_SO_GET_REVISION_MATCH: ··· 1857 1897 .set_optmin = IP6T_BASE_CTL, 1858 1898 .set_optmax = IP6T_SO_SET_MAX+1, 1859 1899 .set = do_ip6t_set_ctl, 1860 - #ifdef CONFIG_COMPAT 1861 - .compat_set = compat_do_ip6t_set_ctl, 1862 - #endif 1863 1900 .get_optmin = IP6T_BASE_CTL, 1864 1901 .get_optmax = IP6T_SO_GET_MAX+1, 1865 1902 .get = do_ip6t_get_ctl, 1866 - #ifdef CONFIG_COMPAT 1867 - .compat_get = compat_do_ip6t_get_ctl, 1868 - #endif 1869 1903 .owner = THIS_MODULE, 1870 1904 }; 1871 1905
-52
net/ipv6/raw.c
··· 1084 1084 return do_rawv6_setsockopt(sk, level, optname, optval, optlen); 1085 1085 } 1086 1086 1087 - #ifdef CONFIG_COMPAT 1088 - static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname, 1089 - char __user *optval, unsigned int optlen) 1090 - { 1091 - switch (level) { 1092 - case SOL_RAW: 1093 - break; 1094 - case SOL_ICMPV6: 1095 - if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) 1096 - return -EOPNOTSUPP; 1097 - return rawv6_seticmpfilter(sk, level, optname, optval, optlen); 1098 - case SOL_IPV6: 1099 - if (optname == IPV6_CHECKSUM || 1100 - optname == IPV6_HDRINCL) 1101 - break; 1102 - fallthrough; 1103 - default: 1104 - return compat_ipv6_setsockopt(sk, level, optname, 1105 - optval, optlen); 1106 - } 1107 - return do_rawv6_setsockopt(sk, level, optname, optval, optlen); 1108 - } 1109 - #endif 1110 - 1111 1087 static int do_rawv6_getsockopt(struct sock *sk, int level, int optname, 1112 1088 char __user *optval, int __user *optlen) 1113 1089 { ··· 1144 1168 1145 1169 return do_rawv6_getsockopt(sk, level, optname, optval, optlen); 1146 1170 } 1147 - 1148 - #ifdef CONFIG_COMPAT 1149 - static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname, 1150 - char __user *optval, int __user *optlen) 1151 - { 1152 - switch (level) { 1153 - case SOL_RAW: 1154 - break; 1155 - case SOL_ICMPV6: 1156 - if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) 1157 - return -EOPNOTSUPP; 1158 - return rawv6_geticmpfilter(sk, level, optname, optval, optlen); 1159 - case SOL_IPV6: 1160 - if (optname == IPV6_CHECKSUM || 1161 - optname == IPV6_HDRINCL) 1162 - break; 1163 - fallthrough; 1164 - default: 1165 - return compat_ipv6_getsockopt(sk, level, optname, 1166 - optval, optlen); 1167 - } 1168 - return do_rawv6_getsockopt(sk, level, optname, optval, optlen); 1169 - } 1170 - #endif 1171 1171 1172 1172 static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg) 1173 1173 { ··· 1249 1297 .usersize = sizeof_field(struct raw6_sock, filter), 1250 1298 .h.raw_hash = &raw_v6_hashinfo, 1251 1299 #ifdef CONFIG_COMPAT 1252 - .compat_setsockopt = compat_rawv6_setsockopt, 1253 - .compat_getsockopt = compat_rawv6_getsockopt, 1254 1300 .compat_ioctl = compat_rawv6_ioctl, 1255 1301 #endif 1256 1302 .diag_destroy = raw_abort, ··· 1328 1378 .sendpage = sock_no_sendpage, 1329 1379 #ifdef CONFIG_COMPAT 1330 1380 .compat_ioctl = inet6_compat_ioctl, 1331 - .compat_setsockopt = compat_sock_common_setsockopt, 1332 - .compat_getsockopt = compat_sock_common_getsockopt, 1333 1381 #endif 1334 1382 }; 1335 1383
-12
net/ipv6/tcp_ipv6.c
··· 1831 1831 .getsockopt = ipv6_getsockopt, 1832 1832 .addr2sockaddr = inet6_csk_addr2sockaddr, 1833 1833 .sockaddr_len = sizeof(struct sockaddr_in6), 1834 - #ifdef CONFIG_COMPAT 1835 - .compat_setsockopt = compat_ipv6_setsockopt, 1836 - .compat_getsockopt = compat_ipv6_getsockopt, 1837 - #endif 1838 1834 .mtu_reduced = tcp_v6_mtu_reduced, 1839 1835 }; 1840 1836 ··· 1857 1861 .getsockopt = ipv6_getsockopt, 1858 1862 .addr2sockaddr = inet6_csk_addr2sockaddr, 1859 1863 .sockaddr_len = sizeof(struct sockaddr_in6), 1860 - #ifdef CONFIG_COMPAT 1861 - .compat_setsockopt = compat_ipv6_setsockopt, 1862 - .compat_getsockopt = compat_ipv6_getsockopt, 1863 - #endif 1864 1864 .mtu_reduced = tcp_v4_mtu_reduced, 1865 1865 }; 1866 1866 ··· 2114 2122 .rsk_prot = &tcp6_request_sock_ops, 2115 2123 .h.hashinfo = &tcp_hashinfo, 2116 2124 .no_autobind = true, 2117 - #ifdef CONFIG_COMPAT 2118 - .compat_setsockopt = compat_tcp_setsockopt, 2119 - .compat_getsockopt = compat_tcp_getsockopt, 2120 - #endif 2121 2125 .diag_destroy = tcp_abort, 2122 2126 }; 2123 2127 EXPORT_SYMBOL_GPL(tcpv6_prot);
-25
net/ipv6/udp.c
··· 1570 1570 return ipv6_setsockopt(sk, level, optname, optval, optlen); 1571 1571 } 1572 1572 1573 - #ifdef CONFIG_COMPAT 1574 - int compat_udpv6_setsockopt(struct sock *sk, int level, int optname, 1575 - char __user *optval, unsigned int optlen) 1576 - { 1577 - if (level == SOL_UDP || level == SOL_UDPLITE) 1578 - return udp_lib_setsockopt(sk, level, optname, optval, optlen, 1579 - udp_v6_push_pending_frames); 1580 - return compat_ipv6_setsockopt(sk, level, optname, optval, optlen); 1581 - } 1582 - #endif 1583 - 1584 1573 int udpv6_getsockopt(struct sock *sk, int level, int optname, 1585 1574 char __user *optval, int __user *optlen) 1586 1575 { ··· 1577 1588 return udp_lib_getsockopt(sk, level, optname, optval, optlen); 1578 1589 return ipv6_getsockopt(sk, level, optname, optval, optlen); 1579 1590 } 1580 - 1581 - #ifdef CONFIG_COMPAT 1582 - int compat_udpv6_getsockopt(struct sock *sk, int level, int optname, 1583 - char __user *optval, int __user *optlen) 1584 - { 1585 - if (level == SOL_UDP || level == SOL_UDPLITE) 1586 - return udp_lib_getsockopt(sk, level, optname, optval, optlen); 1587 - return compat_ipv6_getsockopt(sk, level, optname, optval, optlen); 1588 - } 1589 - #endif 1590 1591 1591 1592 /* thinking of making this const? Don't. 1592 1593 * early_demux can change based on sysctl. ··· 1660 1681 .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min), 1661 1682 .obj_size = sizeof(struct udp6_sock), 1662 1683 .h.udp_table = &udp_table, 1663 - #ifdef CONFIG_COMPAT 1664 - .compat_setsockopt = compat_udpv6_setsockopt, 1665 - .compat_getsockopt = compat_udpv6_getsockopt, 1666 - #endif 1667 1684 .diag_destroy = udp_abort, 1668 1685 }; 1669 1686
-6
net/ipv6/udp_impl.h
··· 19 19 char __user *optval, int __user *optlen); 20 20 int udpv6_setsockopt(struct sock *sk, int level, int optname, 21 21 char __user *optval, unsigned int optlen); 22 - #ifdef CONFIG_COMPAT 23 - int compat_udpv6_setsockopt(struct sock *sk, int level, int optname, 24 - char __user *optval, unsigned int optlen); 25 - int compat_udpv6_getsockopt(struct sock *sk, int level, int optname, 26 - char __user *optval, int __user *optlen); 27 - #endif 28 22 int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); 29 23 int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, 30 24 int flags, int *addr_len);
-4
net/ipv6/udplite.c
··· 52 52 .sysctl_mem = sysctl_udp_mem, 53 53 .obj_size = sizeof(struct udp6_sock), 54 54 .h.udp_table = &udplite_table, 55 - #ifdef CONFIG_COMPAT 56 - .compat_setsockopt = compat_udpv6_setsockopt, 57 - .compat_getsockopt = compat_udpv6_getsockopt, 58 - #endif 59 55 }; 60 56 61 57 static struct inet_protosw udplite6_protosw = {
-2
net/key/af_key.c
··· 3734 3734 .ioctl = sock_no_ioctl, 3735 3735 .listen = sock_no_listen, 3736 3736 .shutdown = sock_no_shutdown, 3737 - .setsockopt = sock_no_setsockopt, 3738 - .getsockopt = sock_no_getsockopt, 3739 3737 .mmap = sock_no_mmap, 3740 3738 .sendpage = sock_no_sendpage, 3741 3739
-8
net/l2tp/l2tp_ip.c
··· 612 612 .hash = l2tp_ip_hash, 613 613 .unhash = l2tp_ip_unhash, 614 614 .obj_size = sizeof(struct l2tp_ip_sock), 615 - #ifdef CONFIG_COMPAT 616 - .compat_setsockopt = compat_ip_setsockopt, 617 - .compat_getsockopt = compat_ip_getsockopt, 618 - #endif 619 615 }; 620 616 621 617 static const struct proto_ops l2tp_ip_ops = { ··· 634 638 .recvmsg = sock_common_recvmsg, 635 639 .mmap = sock_no_mmap, 636 640 .sendpage = sock_no_sendpage, 637 - #ifdef CONFIG_COMPAT 638 - .compat_setsockopt = compat_sock_common_setsockopt, 639 - .compat_getsockopt = compat_sock_common_getsockopt, 640 - #endif 641 641 }; 642 642 643 643 static struct inet_protosw l2tp_ip_protosw = {
-6
net/l2tp/l2tp_ip6.c
··· 745 745 .hash = l2tp_ip6_hash, 746 746 .unhash = l2tp_ip6_unhash, 747 747 .obj_size = sizeof(struct l2tp_ip6_sock), 748 - #ifdef CONFIG_COMPAT 749 - .compat_setsockopt = compat_ipv6_setsockopt, 750 - .compat_getsockopt = compat_ipv6_getsockopt, 751 - #endif 752 748 }; 753 749 754 750 static const struct proto_ops l2tp_ip6_ops = { ··· 769 773 .sendpage = sock_no_sendpage, 770 774 #ifdef CONFIG_COMPAT 771 775 .compat_ioctl = inet6_compat_ioctl, 772 - .compat_setsockopt = compat_sock_common_setsockopt, 773 - .compat_getsockopt = compat_sock_common_getsockopt, 774 776 #endif 775 777 }; 776 778
-6
net/mptcp/protocol.c
··· 2166 2166 .recvmsg = inet_recvmsg, 2167 2167 .mmap = sock_no_mmap, 2168 2168 .sendpage = inet_sendpage, 2169 - #ifdef CONFIG_COMPAT 2170 - .compat_setsockopt = compat_sock_common_setsockopt, 2171 - .compat_getsockopt = compat_sock_common_getsockopt, 2172 - #endif 2173 2169 }; 2174 2170 2175 2171 static struct inet_protosw mptcp_protosw = { ··· 2218 2222 .sendpage = inet_sendpage, 2219 2223 #ifdef CONFIG_COMPAT 2220 2224 .compat_ioctl = inet6_compat_ioctl, 2221 - .compat_setsockopt = compat_sock_common_setsockopt, 2222 - .compat_getsockopt = compat_sock_common_getsockopt, 2223 2225 #endif 2224 2226 }; 2225 2227
+7 -53
net/netfilter/nf_sockopt.c
··· 89 89 return ops; 90 90 } 91 91 92 - /* Call get/setsockopt() */ 93 - static int nf_sockopt(struct sock *sk, u_int8_t pf, int val, 94 - char __user *opt, int *len, int get) 92 + int nf_setsockopt(struct sock *sk, u_int8_t pf, int val, char __user *opt, 93 + unsigned int len) 95 94 { 96 95 struct nf_sockopt_ops *ops; 97 96 int ret; 98 97 99 - ops = nf_sockopt_find(sk, pf, val, get); 98 + ops = nf_sockopt_find(sk, pf, val, 0); 100 99 if (IS_ERR(ops)) 101 100 return PTR_ERR(ops); 102 - 103 - if (get) 104 - ret = ops->get(sk, val, opt, len); 105 - else 106 - ret = ops->set(sk, val, opt, *len); 107 - 101 + ret = ops->set(sk, val, opt, len); 108 102 module_put(ops->owner); 109 103 return ret; 110 - } 111 - 112 - int nf_setsockopt(struct sock *sk, u_int8_t pf, int val, char __user *opt, 113 - unsigned int len) 114 - { 115 - return nf_sockopt(sk, pf, val, opt, &len, 0); 116 104 } 117 105 EXPORT_SYMBOL(nf_setsockopt); 118 106 119 107 int nf_getsockopt(struct sock *sk, u_int8_t pf, int val, char __user *opt, 120 108 int *len) 121 109 { 122 - return nf_sockopt(sk, pf, val, opt, len, 1); 123 - } 124 - EXPORT_SYMBOL(nf_getsockopt); 125 - 126 - #ifdef CONFIG_COMPAT 127 - static int compat_nf_sockopt(struct sock *sk, u_int8_t pf, int val, 128 - char __user *opt, int *len, int get) 129 - { 130 110 struct nf_sockopt_ops *ops; 131 111 int ret; 132 112 133 - ops = nf_sockopt_find(sk, pf, val, get); 113 + ops = nf_sockopt_find(sk, pf, val, 1); 134 114 if (IS_ERR(ops)) 135 115 return PTR_ERR(ops); 136 - 137 - if (get) { 138 - if (ops->compat_get) 139 - ret = ops->compat_get(sk, val, opt, len); 140 - else 141 - ret = ops->get(sk, val, opt, len); 142 - } else { 143 - if (ops->compat_set) 144 - ret = ops->compat_set(sk, val, opt, *len); 145 - else 146 - ret = ops->set(sk, val, opt, *len); 147 - } 148 - 116 + ret = ops->get(sk, val, opt, len); 149 117 module_put(ops->owner); 150 118 return ret; 151 119 } 152 - 153 - int compat_nf_setsockopt(struct sock *sk, u_int8_t pf, 154 - int val, char __user *opt, unsigned int len) 155 - { 156 - return compat_nf_sockopt(sk, pf, val, opt, &len, 0); 157 - } 158 - EXPORT_SYMBOL(compat_nf_setsockopt); 159 - 160 - int compat_nf_getsockopt(struct sock *sk, u_int8_t pf, 161 - int val, char __user *opt, int *len) 162 - { 163 - return compat_nf_sockopt(sk, pf, val, opt, len, 1); 164 - } 165 - EXPORT_SYMBOL(compat_nf_getsockopt); 166 - #endif 120 + EXPORT_SYMBOL(nf_getsockopt);
+4 -5
net/netfilter/x_tables.c
··· 1033 1033 * @user: src pointer to userspace memory 1034 1034 * @len: alleged size of userspace memory 1035 1035 * @info: where to store the xt_counters_info metadata 1036 - * @compat: true if we setsockopt call is done by 32bit task on 64bit kernel 1037 1036 * 1038 1037 * Copies counter meta data from @user and stores it in @info. 1039 1038 * 1040 1039 * vmallocs memory to hold the counters, then copies the counter data 1041 1040 * from @user to the new memory and returns a pointer to it. 1042 1041 * 1043 - * If @compat is true, @info gets converted automatically to the 64bit 1044 - * representation. 1042 + * If called from a compat syscall, @info gets converted automatically to the 1043 + * 64bit representation. 1045 1044 * 1046 1045 * The metadata associated with the counters is stored in @info. 1047 1046 * ··· 1048 1049 * If IS_ERR is false, caller has to vfree the pointer. 1049 1050 */ 1050 1051 void *xt_copy_counters_from_user(const void __user *user, unsigned int len, 1051 - struct xt_counters_info *info, bool compat) 1052 + struct xt_counters_info *info) 1052 1053 { 1053 1054 void *mem; 1054 1055 u64 size; 1055 1056 1056 1057 #ifdef CONFIG_COMPAT 1057 - if (compat) { 1058 + if (in_compat_syscall()) { 1058 1059 /* structures only differ in size due to alignment */ 1059 1060 struct compat_xt_counters_info compat_tmp; 1060 1061
-2
net/nfc/llcp_sock.c
··· 921 921 .ioctl = sock_no_ioctl, 922 922 .listen = sock_no_listen, 923 923 .shutdown = sock_no_shutdown, 924 - .setsockopt = sock_no_setsockopt, 925 - .getsockopt = sock_no_getsockopt, 926 924 .sendmsg = sock_no_sendmsg, 927 925 .recvmsg = llcp_sock_recvmsg, 928 926 .mmap = sock_no_mmap,
-4
net/nfc/rawsock.c
··· 276 276 .ioctl = sock_no_ioctl, 277 277 .listen = sock_no_listen, 278 278 .shutdown = sock_no_shutdown, 279 - .setsockopt = sock_no_setsockopt, 280 - .getsockopt = sock_no_getsockopt, 281 279 .sendmsg = rawsock_sendmsg, 282 280 .recvmsg = rawsock_recvmsg, 283 281 .mmap = sock_no_mmap, ··· 294 296 .ioctl = sock_no_ioctl, 295 297 .listen = sock_no_listen, 296 298 .shutdown = sock_no_shutdown, 297 - .setsockopt = sock_no_setsockopt, 298 - .getsockopt = sock_no_getsockopt, 299 299 .sendmsg = sock_no_sendmsg, 300 300 .recvmsg = rawsock_recvmsg, 301 301 .mmap = sock_no_mmap,
+4 -31
net/packet/af_packet.c
··· 1545 1545 1546 1546 if (sock_flag(&po->sk, SOCK_FILTER_LOCKED)) 1547 1547 return -EPERM; 1548 - if (len != sizeof(fprog)) 1549 - return -EINVAL; 1550 - if (copy_from_user(&fprog, data, len)) 1551 - return -EFAULT; 1548 + 1549 + ret = copy_bpf_fprog_from_user(&fprog, data, len); 1550 + if (ret) 1551 + return ret; 1552 1552 1553 1553 ret = bpf_prog_create_from_user(&new, &fprog, NULL, false); 1554 1554 if (ret) ··· 4040 4040 return 0; 4041 4041 } 4042 4042 4043 - 4044 - #ifdef CONFIG_COMPAT 4045 - static int compat_packet_setsockopt(struct socket *sock, int level, int optname, 4046 - char __user *optval, unsigned int optlen) 4047 - { 4048 - struct packet_sock *po = pkt_sk(sock->sk); 4049 - 4050 - if (level != SOL_PACKET) 4051 - return -ENOPROTOOPT; 4052 - 4053 - if (optname == PACKET_FANOUT_DATA && 4054 - po->fanout && po->fanout->type == PACKET_FANOUT_CBPF) { 4055 - optval = (char __user *)get_compat_bpf_fprog(optval); 4056 - if (!optval) 4057 - return -EFAULT; 4058 - optlen = sizeof(struct sock_fprog); 4059 - } 4060 - 4061 - return packet_setsockopt(sock, level, optname, optval, optlen); 4062 - } 4063 - #endif 4064 - 4065 4043 static int packet_notifier(struct notifier_block *this, 4066 4044 unsigned long msg, void *ptr) 4067 4045 { ··· 4503 4525 .gettstamp = sock_gettstamp, 4504 4526 .listen = sock_no_listen, 4505 4527 .shutdown = sock_no_shutdown, 4506 - .setsockopt = sock_no_setsockopt, 4507 - .getsockopt = sock_no_getsockopt, 4508 4528 .sendmsg = packet_sendmsg_spkt, 4509 4529 .recvmsg = packet_recvmsg, 4510 4530 .mmap = sock_no_mmap, ··· 4525 4549 .shutdown = sock_no_shutdown, 4526 4550 .setsockopt = packet_setsockopt, 4527 4551 .getsockopt = packet_getsockopt, 4528 - #ifdef CONFIG_COMPAT 4529 - .compat_setsockopt = compat_packet_setsockopt, 4530 - #endif 4531 4552 .sendmsg = packet_sendmsg, 4532 4553 .recvmsg = packet_recvmsg, 4533 4554 .mmap = packet_mmap,
-10
net/phonet/socket.c
··· 439 439 .ioctl = pn_socket_ioctl, 440 440 .listen = sock_no_listen, 441 441 .shutdown = sock_no_shutdown, 442 - .setsockopt = sock_no_setsockopt, 443 - .getsockopt = sock_no_getsockopt, 444 - #ifdef CONFIG_COMPAT 445 - .compat_setsockopt = sock_no_setsockopt, 446 - .compat_getsockopt = sock_no_getsockopt, 447 - #endif 448 442 .sendmsg = pn_socket_sendmsg, 449 443 .recvmsg = sock_common_recvmsg, 450 444 .mmap = sock_no_mmap, ··· 460 466 .shutdown = sock_no_shutdown, 461 467 .setsockopt = sock_common_setsockopt, 462 468 .getsockopt = sock_common_getsockopt, 463 - #ifdef CONFIG_COMPAT 464 - .compat_setsockopt = compat_sock_common_setsockopt, 465 - .compat_getsockopt = compat_sock_common_getsockopt, 466 - #endif 467 469 .sendmsg = pn_socket_sendmsg, 468 470 .recvmsg = sock_common_recvmsg, 469 471 .mmap = sock_no_mmap,
-2
net/qrtr/qrtr.c
··· 1208 1208 .gettstamp = sock_gettstamp, 1209 1209 .poll = datagram_poll, 1210 1210 .shutdown = sock_no_shutdown, 1211 - .setsockopt = sock_no_setsockopt, 1212 - .getsockopt = sock_no_getsockopt, 1213 1211 .release = qrtr_release, 1214 1212 .mmap = sock_no_mmap, 1215 1213 .sendpage = sock_no_sendpage,
-6
net/sctp/ipv6.c
··· 1033 1033 .mmap = sock_no_mmap, 1034 1034 #ifdef CONFIG_COMPAT 1035 1035 .compat_ioctl = inet6_compat_ioctl, 1036 - .compat_setsockopt = compat_sock_common_setsockopt, 1037 - .compat_getsockopt = compat_sock_common_getsockopt, 1038 1036 #endif 1039 1037 }; 1040 1038 ··· 1087 1089 .net_header_len = sizeof(struct ipv6hdr), 1088 1090 .sockaddr_len = sizeof(struct sockaddr_in6), 1089 1091 .ip_options_len = sctp_v6_ip_options_len, 1090 - #ifdef CONFIG_COMPAT 1091 - .compat_setsockopt = compat_ipv6_setsockopt, 1092 - .compat_getsockopt = compat_ipv6_getsockopt, 1093 - #endif 1094 1092 }; 1095 1093 1096 1094 static struct sctp_pf sctp_pf_inet6 = {
-8
net/sctp/protocol.c
··· 1036 1036 .recvmsg = inet_recvmsg, 1037 1037 .mmap = sock_no_mmap, 1038 1038 .sendpage = sock_no_sendpage, 1039 - #ifdef CONFIG_COMPAT 1040 - .compat_setsockopt = compat_sock_common_setsockopt, 1041 - .compat_getsockopt = compat_sock_common_getsockopt, 1042 - #endif 1043 1039 }; 1044 1040 1045 1041 /* Registration with AF_INET family. */ ··· 1089 1093 .net_header_len = sizeof(struct iphdr), 1090 1094 .sockaddr_len = sizeof(struct sockaddr_in), 1091 1095 .ip_options_len = sctp_v4_ip_options_len, 1092 - #ifdef CONFIG_COMPAT 1093 - .compat_setsockopt = compat_ip_setsockopt, 1094 - .compat_getsockopt = compat_ip_getsockopt, 1095 - #endif 1096 1096 }; 1097 1097 1098 1098 struct sctp_pf *sctp_get_pf_specific(sa_family_t family)
+7 -2
net/smc/af_smc.c
··· 1742 1742 /* generic setsockopts reaching us here always apply to the 1743 1743 * CLC socket 1744 1744 */ 1745 - rc = smc->clcsock->ops->setsockopt(smc->clcsock, level, optname, 1746 - optval, optlen); 1745 + if (unlikely(!smc->clcsock->ops->setsockopt)) 1746 + rc = -EOPNOTSUPP; 1747 + else 1748 + rc = smc->clcsock->ops->setsockopt(smc->clcsock, level, optname, 1749 + optval, optlen); 1747 1750 if (smc->clcsock->sk->sk_err) { 1748 1751 sk->sk_err = smc->clcsock->sk->sk_err; 1749 1752 sk->sk_error_report(sk); ··· 1811 1808 1812 1809 smc = smc_sk(sock->sk); 1813 1810 /* socket options apply to the CLC socket */ 1811 + if (unlikely(!smc->clcsock->ops->getsockopt)) 1812 + return -EOPNOTSUPP; 1814 1813 return smc->clcsock->ops->getsockopt(smc->clcsock, level, optname, 1815 1814 optval, optlen); 1816 1815 }
+56 -55
net/socket.c
··· 2094 2094 * Set a socket option. Because we don't know the option lengths we have 2095 2095 * to pass the user mode parameter for the protocols to sort out. 2096 2096 */ 2097 - 2098 - static int __sys_setsockopt(int fd, int level, int optname, 2099 - char __user *optval, int optlen) 2097 + int __sys_setsockopt(int fd, int level, int optname, char __user *optval, 2098 + int optlen) 2100 2099 { 2101 2100 mm_segment_t oldfs = get_fs(); 2102 2101 char *kernel_optval = NULL; ··· 2106 2107 return -EINVAL; 2107 2108 2108 2109 sock = sockfd_lookup_light(fd, &err, &fput_needed); 2109 - if (sock != NULL) { 2110 - err = security_socket_setsockopt(sock, level, optname); 2111 - if (err) 2112 - goto out_put; 2110 + if (!sock) 2111 + return err; 2113 2112 2114 - err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, 2115 - &optname, optval, &optlen, 2113 + err = security_socket_setsockopt(sock, level, optname); 2114 + if (err) 2115 + goto out_put; 2116 + 2117 + if (!in_compat_syscall()) 2118 + err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname, 2119 + optval, &optlen, 2116 2120 &kernel_optval); 2117 - 2118 - if (err < 0) { 2119 - goto out_put; 2120 - } else if (err > 0) { 2121 - err = 0; 2122 - goto out_put; 2123 - } 2124 - 2125 - if (kernel_optval) { 2126 - set_fs(KERNEL_DS); 2127 - optval = (char __user __force *)kernel_optval; 2128 - } 2129 - 2130 - if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock)) 2131 - err = 2132 - sock_setsockopt(sock, level, optname, optval, 2133 - optlen); 2134 - else 2135 - err = 2136 - sock->ops->setsockopt(sock, level, optname, optval, 2137 - optlen); 2138 - 2139 - if (kernel_optval) { 2140 - set_fs(oldfs); 2141 - kfree(kernel_optval); 2142 - } 2143 - out_put: 2144 - fput_light(sock->file, fput_needed); 2121 + if (err < 0) 2122 + goto out_put; 2123 + if (err > 0) { 2124 + err = 0; 2125 + goto out_put; 2145 2126 } 2127 + 2128 + if (kernel_optval) { 2129 + set_fs(KERNEL_DS); 2130 + optval = (char __user __force *)kernel_optval; 2131 + } 2132 + 2133 + if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock)) 2134 + err = sock_setsockopt(sock, level, optname, optval, optlen); 2135 + else if (unlikely(!sock->ops->setsockopt)) 2136 + err = -EOPNOTSUPP; 2137 + else 2138 + err = sock->ops->setsockopt(sock, level, optname, optval, 2139 + optlen); 2140 + 2141 + if (kernel_optval) { 2142 + set_fs(oldfs); 2143 + kfree(kernel_optval); 2144 + } 2145 + 2146 + out_put: 2147 + fput_light(sock->file, fput_needed); 2146 2148 return err; 2147 2149 } 2148 2150 ··· 2157 2157 * Get a socket option. Because we don't know the option lengths we have 2158 2158 * to pass a user mode parameter for the protocols to sort out. 2159 2159 */ 2160 - 2161 - static int __sys_getsockopt(int fd, int level, int optname, 2162 - char __user *optval, int __user *optlen) 2160 + int __sys_getsockopt(int fd, int level, int optname, char __user *optval, 2161 + int __user *optlen) 2163 2162 { 2164 2163 int err, fput_needed; 2165 2164 struct socket *sock; 2166 2165 int max_optlen; 2167 2166 2168 2167 sock = sockfd_lookup_light(fd, &err, &fput_needed); 2169 - if (sock != NULL) { 2170 - err = security_socket_getsockopt(sock, level, optname); 2171 - if (err) 2172 - goto out_put; 2168 + if (!sock) 2169 + return err; 2173 2170 2171 + err = security_socket_getsockopt(sock, level, optname); 2172 + if (err) 2173 + goto out_put; 2174 + 2175 + if (!in_compat_syscall()) 2174 2176 max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen); 2175 2177 2176 - if (level == SOL_SOCKET) 2177 - err = 2178 - sock_getsockopt(sock, level, optname, optval, 2178 + if (level == SOL_SOCKET) 2179 + err = sock_getsockopt(sock, level, optname, optval, optlen); 2180 + else if (unlikely(!sock->ops->getsockopt)) 2181 + err = -EOPNOTSUPP; 2182 + else 2183 + err = sock->ops->getsockopt(sock, level, optname, optval, 2179 2184 optlen); 2180 - else 2181 - err = 2182 - sock->ops->getsockopt(sock, level, optname, optval, 2183 - optlen); 2184 2185 2186 + if (!in_compat_syscall()) 2185 2187 err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname, 2186 - optval, optlen, 2187 - max_optlen, err); 2188 + optval, optlen, max_optlen, 2189 + err); 2188 2190 out_put: 2189 - fput_light(sock->file, fput_needed); 2190 - } 2191 + fput_light(sock->file, fput_needed); 2191 2192 return err; 2192 2193 } 2193 2194
-6
net/unix/af_unix.c
··· 714 714 #endif 715 715 .listen = unix_listen, 716 716 .shutdown = unix_shutdown, 717 - .setsockopt = sock_no_setsockopt, 718 - .getsockopt = sock_no_getsockopt, 719 717 .sendmsg = unix_stream_sendmsg, 720 718 .recvmsg = unix_stream_recvmsg, 721 719 .mmap = sock_no_mmap, ··· 739 741 #endif 740 742 .listen = sock_no_listen, 741 743 .shutdown = unix_shutdown, 742 - .setsockopt = sock_no_setsockopt, 743 - .getsockopt = sock_no_getsockopt, 744 744 .sendmsg = unix_dgram_sendmsg, 745 745 .recvmsg = unix_dgram_recvmsg, 746 746 .mmap = sock_no_mmap, ··· 763 767 #endif 764 768 .listen = unix_listen, 765 769 .shutdown = unix_shutdown, 766 - .setsockopt = sock_no_setsockopt, 767 - .getsockopt = sock_no_getsockopt, 768 770 .sendmsg = unix_seqpacket_sendmsg, 769 771 .recvmsg = unix_seqpacket_recvmsg, 770 772 .mmap = sock_no_mmap,
-2
net/vmw_vsock/af_vsock.c
··· 1202 1202 .ioctl = sock_no_ioctl, 1203 1203 .listen = sock_no_listen, 1204 1204 .shutdown = vsock_shutdown, 1205 - .setsockopt = sock_no_setsockopt, 1206 - .getsockopt = sock_no_getsockopt, 1207 1205 .sendmsg = vsock_dgram_sendmsg, 1208 1206 .recvmsg = vsock_dgram_recvmsg, 1209 1207 .mmap = sock_no_mmap,
+2 -2
tools/include/uapi/asm-generic/unistd.h
··· 606 606 #define __NR_recvfrom 207 607 607 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom) 608 608 #define __NR_setsockopt 208 609 - __SC_COMP(__NR_setsockopt, sys_setsockopt, compat_sys_setsockopt) 609 + __SC_COMP(__NR_setsockopt, sys_setsockopt, sys_setsockopt) 610 610 #define __NR_getsockopt 209 611 - __SC_COMP(__NR_getsockopt, sys_getsockopt, compat_sys_getsockopt) 611 + __SC_COMP(__NR_getsockopt, sys_getsockopt, sys_getsockopt) 612 612 #define __NR_shutdown 210 613 613 __SYSCALL(__NR_shutdown, sys_shutdown) 614 614 #define __NR_sendmsg 211
+2 -2
tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
··· 427 427 336 common recv sys_recv compat_sys_recv 428 428 337 common recvfrom sys_recvfrom compat_sys_recvfrom 429 429 338 common shutdown sys_shutdown 430 - 339 common setsockopt sys_setsockopt compat_sys_setsockopt 431 - 340 common getsockopt sys_getsockopt compat_sys_getsockopt 430 + 339 common setsockopt sys_setsockopt sys_setsockopt 431 + 340 common getsockopt sys_getsockopt sys_getsockopt 432 432 341 common sendmsg sys_sendmsg compat_sys_sendmsg 433 433 342 common recvmsg sys_recvmsg compat_sys_recvmsg 434 434 343 32 recvmmsg sys_recvmmsg_time32 compat_sys_recvmmsg_time32
+2 -2
tools/perf/arch/s390/entry/syscalls/syscall.tbl
··· 372 372 362 common connect sys_connect compat_sys_connect 373 373 363 common listen sys_listen sys_listen 374 374 364 common accept4 sys_accept4 compat_sys_accept4 375 - 365 common getsockopt sys_getsockopt compat_sys_getsockopt 376 - 366 common setsockopt sys_setsockopt compat_sys_setsockopt 375 + 365 common getsockopt sys_getsockopt sys_getsockopt 376 + 366 common setsockopt sys_setsockopt sys_setsockopt 377 377 367 common getsockname sys_getsockname compat_sys_getsockname 378 378 368 common getpeername sys_getpeername compat_sys_getpeername 379 379 369 common sendto sys_sendto compat_sys_sendto
+2 -2
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl
··· 396 396 538 x32 sendmmsg compat_sys_sendmmsg 397 397 539 x32 process_vm_readv compat_sys_process_vm_readv 398 398 540 x32 process_vm_writev compat_sys_process_vm_writev 399 - 541 x32 setsockopt compat_sys_setsockopt 400 - 542 x32 getsockopt compat_sys_getsockopt 399 + 541 x32 setsockopt sys_setsockopt 400 + 542 x32 getsockopt sys_getsockopt 401 401 543 x32 io_setup compat_sys_io_setup 402 402 544 x32 io_submit compat_sys_io_submit 403 403 545 x32 execveat compat_sys_execveat