net: remove compat_sys_{get,set}sockopt
authorChristoph Hellwig <hch@lst.de>
Fri, 17 Jul 2020 06:23:15 +0000 (08:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Jul 2020 01:16:40 +0000 (18:16 -0700)
Now that the ->compat_{get,set}sockopt proto_ops methods are gone
there is no good reason left to keep the compat syscalls separate.

This fixes the odd use of unsigned int for the compat_setsockopt
optlen and the missing sock_use_custom_sol_socket.

It would also easily allow running the eBPF hooks for the compat
syscalls, but such a large change in behavior does not belong into
a consolidation patch like this one.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
20 files changed:
arch/arm64/include/asm/unistd32.h
arch/mips/kernel/syscalls/syscall_n32.tbl
arch/mips/kernel/syscalls/syscall_o32.tbl
arch/parisc/kernel/syscalls/syscall.tbl
arch/powerpc/kernel/syscalls/syscall.tbl
arch/s390/kernel/syscalls/syscall.tbl
arch/sparc/kernel/sys32.S
arch/sparc/kernel/syscalls/syscall.tbl
arch/x86/entry/syscall_x32.c
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/entry/syscalls/syscall_64.tbl
include/linux/compat.h
include/linux/syscalls.h
include/uapi/asm-generic/unistd.h
net/compat.c
net/socket.c
tools/include/uapi/asm-generic/unistd.h
tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
tools/perf/arch/s390/entry/syscalls/syscall.tbl
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl

index 6d95d0c..166e369 100644 (file)
@@ -599,9 +599,9 @@ __SYSCALL(__NR_recvfrom, compat_sys_recvfrom)
 #define __NR_shutdown 293
 __SYSCALL(__NR_shutdown, sys_shutdown)
 #define __NR_setsockopt 294
-__SYSCALL(__NR_setsockopt, compat_sys_setsockopt)
+__SYSCALL(__NR_setsockopt, sys_setsockopt)
 #define __NR_getsockopt 295
-__SYSCALL(__NR_getsockopt, compat_sys_getsockopt)
+__SYSCALL(__NR_getsockopt, sys_getsockopt)
 #define __NR_sendmsg 296
 __SYSCALL(__NR_sendmsg, compat_sys_sendmsg)
 #define __NR_recvmsg 297
index f777141..8488b0d 100644 (file)
@@ -60,8 +60,8 @@
 50     n32     getsockname                     sys_getsockname
 51     n32     getpeername                     sys_getpeername
 52     n32     socketpair                      sys_socketpair
-53     n32     setsockopt                      compat_sys_setsockopt
-54     n32     getsockopt                      compat_sys_getsockopt
+53     n32     setsockopt                      sys_setsockopt
+54     n32     getsockopt                      sys_getsockopt
 55     n32     clone                           __sys_clone
 56     n32     fork                            __sys_fork
 57     n32     execve                          compat_sys_execve
index 1328062..b20522f 100644 (file)
 170    o32     connect                         sys_connect
 171    o32     getpeername                     sys_getpeername
 172    o32     getsockname                     sys_getsockname
-173    o32     getsockopt                      sys_getsockopt                  compat_sys_getsockopt
+173    o32     getsockopt                      sys_getsockopt                  sys_getsockopt
 174    o32     listen                          sys_listen
 175    o32     recv                            sys_recv                        compat_sys_recv
 176    o32     recvfrom                        sys_recvfrom                    compat_sys_recvfrom
 178    o32     send                            sys_send
 179    o32     sendmsg                         sys_sendmsg                     compat_sys_sendmsg
 180    o32     sendto                          sys_sendto
-181    o32     setsockopt                      sys_setsockopt                  compat_sys_setsockopt
+181    o32     setsockopt                      sys_setsockopt                  sys_setsockopt
 182    o32     shutdown                        sys_shutdown
 183    o32     socket                          sys_socket
 184    o32     socketpair                      sys_socketpair
index 5a758fa..3494e4f 100644 (file)
 178    common  rt_sigqueueinfo         sys_rt_sigqueueinfo             compat_sys_rt_sigqueueinfo
 179    common  rt_sigsuspend           sys_rt_sigsuspend               compat_sys_rt_sigsuspend
 180    common  chown                   sys_chown
-181    common  setsockopt              sys_setsockopt                  compat_sys_setsockopt
-182    common  getsockopt              sys_getsockopt                  compat_sys_getsockopt
+181    common  setsockopt              sys_setsockopt                  sys_setsockopt
+182    common  getsockopt              sys_getsockopt                  sys_getsockopt
 183    common  sendmsg                 sys_sendmsg                     compat_sys_sendmsg
 184    common  recvmsg                 sys_recvmsg                     compat_sys_recvmsg
 185    common  semop                   sys_semop
index f833a31..94eb5b2 100644 (file)
 336    common  recv                            sys_recv                        compat_sys_recv
 337    common  recvfrom                        sys_recvfrom                    compat_sys_recvfrom
 338    common  shutdown                        sys_shutdown
-339    common  setsockopt                      sys_setsockopt                  compat_sys_setsockopt
-340    common  getsockopt                      sys_getsockopt                  compat_sys_getsockopt
+339    common  setsockopt                      sys_setsockopt                  sys_setsockopt
+340    common  getsockopt                      sys_getsockopt                  sys_getsockopt
 341    common  sendmsg                         sys_sendmsg                     compat_sys_sendmsg
 342    common  recvmsg                         sys_recvmsg                     compat_sys_recvmsg
 343    32      recvmmsg                        sys_recvmmsg_time32             compat_sys_recvmmsg_time32
index bfdcb76..0d63c71 100644 (file)
 362  common    connect                 sys_connect                     sys_connect
 363  common    listen                  sys_listen                      sys_listen
 364  common    accept4                 sys_accept4                     sys_accept4
-365  common    getsockopt              sys_getsockopt                  compat_sys_getsockopt
-366  common    setsockopt              sys_setsockopt                  compat_sys_setsockopt
+365  common    getsockopt              sys_getsockopt                  sys_getsockopt
+366  common    setsockopt              sys_setsockopt                  sys_setsockopt
 367  common    getsockname             sys_getsockname                 sys_getsockname
 368  common    getpeername             sys_getpeername                 sys_getpeername
 369  common    sendto                  sys_sendto                      sys_sendto
index 489ffab..a45f0f3 100644 (file)
@@ -157,22 +157,22 @@ do_sys_shutdown: /* sys_shutdown(int, int) */
        nop
        nop
        nop
-do_sys_setsockopt: /* compat_sys_setsockopt(int, int, int, char *, int) */
+do_sys_setsockopt: /* sys_setsockopt(int, int, int, char *, int) */
 47:    ldswa           [%o1 + 0x0] %asi, %o0
-       sethi           %hi(compat_sys_setsockopt), %g1
+       sethi           %hi(sys_setsockopt), %g1
 48:    ldswa           [%o1 + 0x8] %asi, %o2
 49:    lduwa           [%o1 + 0xc] %asi, %o3
 50:    ldswa           [%o1 + 0x10] %asi, %o4
-       jmpl            %g1 + %lo(compat_sys_setsockopt), %g0
+       jmpl            %g1 + %lo(sys_setsockopt), %g0
 51:     ldswa          [%o1 + 0x4] %asi, %o1
        nop
-do_sys_getsockopt: /* compat_sys_getsockopt(int, int, int, u32, u32) */
+do_sys_getsockopt: /* sys_getsockopt(int, int, int, u32, u32) */
 52:    ldswa           [%o1 + 0x0] %asi, %o0
-       sethi           %hi(compat_sys_getsockopt), %g1
+       sethi           %hi(sys_getsockopt), %g1
 53:    ldswa           [%o1 + 0x8] %asi, %o2
 54:    lduwa           [%o1 + 0xc] %asi, %o3
 55:    lduwa           [%o1 + 0x10] %asi, %o4
-       jmpl            %g1 + %lo(compat_sys_getsockopt), %g0
+       jmpl            %g1 + %lo(sys_getsockopt), %g0
 56:     ldswa          [%o1 + 0x4] %asi, %o1
        nop
 do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
index 8004a27..c59b379 100644 (file)
 115    32      getgroups32             sys_getgroups
 116    common  gettimeofday            sys_gettimeofday                compat_sys_gettimeofday
 117    common  getrusage               sys_getrusage                   compat_sys_getrusage
-118    common  getsockopt              sys_getsockopt                  compat_sys_getsockopt
+118    common  getsockopt              sys_getsockopt                  sys_getsockopt
 119    common  getcwd                  sys_getcwd
 120    common  readv                   sys_readv                       compat_sys_readv
 121    common  writev                  sys_writev                      compat_sys_writev
 352    common  userfaultfd             sys_userfaultfd
 353    common  bind                    sys_bind
 354    common  listen                  sys_listen
-355    common  setsockopt              sys_setsockopt                  compat_sys_setsockopt
+355    common  setsockopt              sys_setsockopt                  sys_setsockopt
 356    common  mlock2                  sys_mlock2
 357    common  copy_file_range         sys_copy_file_range
 358    common  preadv2                 sys_preadv2                     compat_sys_preadv2
index 3d8d70d..1583831 100644 (file)
@@ -8,6 +8,13 @@
 #include <asm/unistd.h>
 #include <asm/syscall.h>
 
+/*
+ * Reuse the 64-bit entry points for the x32 versions that occupy different
+ * slots in the syscall table.
+ */
+#define __x32_sys_getsockopt   __x64_sys_getsockopt
+#define __x32_sys_setsockopt   __x64_sys_setsockopt
+
 #define __SYSCALL_64(nr, sym)
 
 #define __SYSCALL_X32(nr, sym) extern long __x32_##sym(const struct pt_regs *);
index d8f8a1a..43742a6 100644 (file)
 362    i386    connect                 sys_connect
 363    i386    listen                  sys_listen
 364    i386    accept4                 sys_accept4
-365    i386    getsockopt              sys_getsockopt                  compat_sys_getsockopt
-366    i386    setsockopt              sys_setsockopt                  compat_sys_setsockopt
+365    i386    getsockopt              sys_getsockopt                  sys_getsockopt
+366    i386    setsockopt              sys_setsockopt                  sys_setsockopt
 367    i386    getsockname             sys_getsockname
 368    i386    getpeername             sys_getpeername
 369    i386    sendto                  sys_sendto
index 78847b3..e008d63 100644 (file)
 538    x32     sendmmsg                compat_sys_sendmmsg
 539    x32     process_vm_readv        compat_sys_process_vm_readv
 540    x32     process_vm_writev       compat_sys_process_vm_writev
-541    x32     setsockopt              compat_sys_setsockopt
-542    x32     getsockopt              compat_sys_getsockopt
+541    x32     setsockopt              sys_setsockopt
+542    x32     getsockopt              sys_getsockopt
 543    x32     io_setup                compat_sys_io_setup
 544    x32     io_submit               compat_sys_io_submit
 545    x32     execveat                compat_sys_execveat
index e90100c..c4255d8 100644 (file)
@@ -737,10 +737,6 @@ asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
 asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len,
                            unsigned flags, struct sockaddr __user *addr,
                            int __user *addrlen);
-asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
-                                     char __user *optval, unsigned int optlen);
-asmlinkage long compat_sys_getsockopt(int fd, int level, int optname,
-                                     char __user *optval, int __user *optlen);
 asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
                                   unsigned flags);
 asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
index b951a87..aa46825 100644 (file)
@@ -1424,4 +1424,8 @@ long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
                            unsigned int nsops,
                            const struct old_timespec32 __user *timeout);
 
+int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
+               int __user *optlen);
+int __sys_setsockopt(int fd, int level, int optname, char __user *optval,
+               int optlen);
 #endif
index f4a0130..c8c189a 100644 (file)
@@ -606,9 +606,9 @@ __SYSCALL(__NR_sendto, sys_sendto)
 #define __NR_recvfrom 207
 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom)
 #define __NR_setsockopt 208
-__SC_COMP(__NR_setsockopt, sys_setsockopt, compat_sys_setsockopt)
+__SC_COMP(__NR_setsockopt, sys_setsockopt, sys_setsockopt)
 #define __NR_getsockopt 209
-__SC_COMP(__NR_getsockopt, sys_getsockopt, compat_sys_getsockopt)
+__SC_COMP(__NR_getsockopt, sys_getsockopt, sys_getsockopt)
 #define __NR_shutdown 210
 __SYSCALL(__NR_shutdown, sys_shutdown)
 #define __NR_sendmsg 211
index 3e6c2c5..091875b 100644 (file)
@@ -335,77 +335,6 @@ void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm)
        __scm_destroy(scm);
 }
 
-static int __compat_sys_setsockopt(int fd, int level, int optname,
-                                  char __user *optval, unsigned int optlen)
-{
-       int err;
-       struct socket *sock;
-
-       if (optlen > INT_MAX)
-               return -EINVAL;
-
-       sock = sockfd_lookup(fd, &err);
-       if (sock) {
-               err = security_socket_setsockopt(sock, level, optname);
-               if (err) {
-                       sockfd_put(sock);
-                       return err;
-               }
-
-               if (level == SOL_SOCKET)
-                       err = sock_setsockopt(sock, level,
-                                       optname, optval, optlen);
-               else if (sock->ops->compat_setsockopt)
-                       err = sock->ops->compat_setsockopt(sock, level,
-                                       optname, optval, optlen);
-               else
-                       err = sock->ops->setsockopt(sock, level,
-                                       optname, optval, optlen);
-               sockfd_put(sock);
-       }
-       return err;
-}
-
-COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
-                      char __user *, optval, unsigned int, optlen)
-{
-       return __compat_sys_setsockopt(fd, level, optname, optval, optlen);
-}
-
-static int __compat_sys_getsockopt(int fd, int level, int optname,
-                                  char __user *optval,
-                                  int __user *optlen)
-{
-       int err;
-       struct socket *sock = sockfd_lookup(fd, &err);
-
-       if (sock) {
-               err = security_socket_getsockopt(sock, level, optname);
-               if (err) {
-                       sockfd_put(sock);
-                       return err;
-               }
-
-               if (level == SOL_SOCKET)
-                       err = sock_getsockopt(sock, level,
-                                       optname, optval, optlen);
-               else if (sock->ops->compat_getsockopt)
-                       err = sock->ops->compat_getsockopt(sock, level,
-                                       optname, optval, optlen);
-               else
-                       err = sock->ops->getsockopt(sock, level,
-                                       optname, optval, optlen);
-               sockfd_put(sock);
-       }
-       return err;
-}
-
-COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
-                      char __user *, optval, int __user *, optlen)
-{
-       return __compat_sys_getsockopt(fd, level, optname, optval, optlen);
-}
-
 /* Argument list sizes for compat_sys_socketcall */
 #define AL(x) ((x) * sizeof(u32))
 static unsigned char nas[21] = {
@@ -565,13 +494,11 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)
                ret = __sys_shutdown(a0, a1);
                break;
        case SYS_SETSOCKOPT:
-               ret = __compat_sys_setsockopt(a0, a1, a[2],
-                                             compat_ptr(a[3]), a[4]);
+               ret = __sys_setsockopt(a0, a1, a[2], compat_ptr(a[3]), a[4]);
                break;
        case SYS_GETSOCKOPT:
-               ret = __compat_sys_getsockopt(a0, a1, a[2],
-                                             compat_ptr(a[3]),
-                                             compat_ptr(a[4]));
+               ret = __sys_getsockopt(a0, a1, a[2], compat_ptr(a[3]),
+                                      compat_ptr(a[4]));
                break;
        case SYS_SENDMSG:
                ret = __compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
index b79376b..dec3459 100644 (file)
@@ -2094,9 +2094,8 @@ static bool sock_use_custom_sol_socket(const struct socket *sock)
  *     Set a socket option. Because we don't know the option lengths we have
  *     to pass the user mode parameter for the protocols to sort out.
  */
-
-static int __sys_setsockopt(int fd, int level, int optname,
-                           char __user *optval, int optlen)
+int __sys_setsockopt(int fd, int level, int optname, char __user *optval,
+               int optlen)
 {
        mm_segment_t oldfs = get_fs();
        char *kernel_optval = NULL;
@@ -2114,8 +2113,10 @@ static int __sys_setsockopt(int fd, int level, int optname,
        if (err)
                goto out_put;
 
-       err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname,
-                                            optval, &optlen, &kernel_optval);
+       if (!in_compat_syscall())
+               err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname,
+                                                    optval, &optlen,
+                                                    &kernel_optval);
        if (err < 0)
                goto out_put;
        if (err > 0) {
@@ -2154,9 +2155,8 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
  *     Get a socket option. Because we don't know the option lengths we have
  *     to pass a user mode parameter for the protocols to sort out.
  */
-
-static int __sys_getsockopt(int fd, int level, int optname,
-                           char __user *optval, int __user *optlen)
+int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
+               int __user *optlen)
 {
        int err, fput_needed;
        struct socket *sock;
@@ -2170,7 +2170,8 @@ static int __sys_getsockopt(int fd, int level, int optname,
        if (err)
                goto out_put;
 
-       max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
+       if (!in_compat_syscall())
+               max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
 
        if (level == SOL_SOCKET)
                err = sock_getsockopt(sock, level, optname, optval, optlen);
@@ -2178,8 +2179,10 @@ static int __sys_getsockopt(int fd, int level, int optname,
                err = sock->ops->getsockopt(sock, level, optname, optval,
                                            optlen);
 
-       err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname, optval,
-                                            optlen, max_optlen, err);
+       if (!in_compat_syscall())
+               err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname,
+                                                    optval, optlen, max_optlen,
+                                                    err);
 out_put:
        fput_light(sock->file, fput_needed);
        return err;
index f4a0130..c8c189a 100644 (file)
@@ -606,9 +606,9 @@ __SYSCALL(__NR_sendto, sys_sendto)
 #define __NR_recvfrom 207
 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom)
 #define __NR_setsockopt 208
-__SC_COMP(__NR_setsockopt, sys_setsockopt, compat_sys_setsockopt)
+__SC_COMP(__NR_setsockopt, sys_setsockopt, sys_setsockopt)
 #define __NR_getsockopt 209
-__SC_COMP(__NR_getsockopt, sys_getsockopt, compat_sys_getsockopt)
+__SC_COMP(__NR_getsockopt, sys_getsockopt, sys_getsockopt)
 #define __NR_shutdown 210
 __SYSCALL(__NR_shutdown, sys_shutdown)
 #define __NR_sendmsg 211
index 35b61bf..b190f2e 100644 (file)
 336    common  recv                            sys_recv                        compat_sys_recv
 337    common  recvfrom                        sys_recvfrom                    compat_sys_recvfrom
 338    common  shutdown                        sys_shutdown
-339    common  setsockopt                      sys_setsockopt                  compat_sys_setsockopt
-340    common  getsockopt                      sys_getsockopt                  compat_sys_getsockopt
+339    common  setsockopt                      sys_setsockopt                  sys_setsockopt
+340    common  getsockopt                      sys_getsockopt                  sys_getsockopt
 341    common  sendmsg                         sys_sendmsg                     compat_sys_sendmsg
 342    common  recvmsg                         sys_recvmsg                     compat_sys_recvmsg
 343    32      recvmmsg                        sys_recvmmsg_time32             compat_sys_recvmmsg_time32
index b38d484..56ae24b 100644 (file)
 362  common    connect                 sys_connect                     compat_sys_connect
 363  common    listen                  sys_listen                      sys_listen
 364  common    accept4                 sys_accept4                     compat_sys_accept4
-365  common    getsockopt              sys_getsockopt                  compat_sys_getsockopt
-366  common    setsockopt              sys_setsockopt                  compat_sys_setsockopt
+365  common    getsockopt              sys_getsockopt                  sys_getsockopt
+366  common    setsockopt              sys_setsockopt                  sys_setsockopt
 367  common    getsockname             sys_getsockname                 compat_sys_getsockname
 368  common    getpeername             sys_getpeername                 compat_sys_getpeername
 369  common    sendto                  sys_sendto                      compat_sys_sendto
index 78847b3..e008d63 100644 (file)
 538    x32     sendmmsg                compat_sys_sendmmsg
 539    x32     process_vm_readv        compat_sys_process_vm_readv
 540    x32     process_vm_writev       compat_sys_process_vm_writev
-541    x32     setsockopt              compat_sys_setsockopt
-542    x32     getsockopt              compat_sys_getsockopt
+541    x32     setsockopt              sys_setsockopt
+542    x32     getsockopt              sys_getsockopt
 543    x32     io_setup                compat_sys_io_setup
 544    x32     io_submit               compat_sys_io_submit
 545    x32     execveat                compat_sys_execveat