forked from Minki/linux
net: remove compat_sys_{get,set}sockopt
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>
This commit is contained in:
parent
8c918ffbba
commit
55db9c0e85
@ -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
|
||||
|
@ -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
|
||||
|
@ -184,7 +184,7 @@
|
||||
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
|
||||
@ -192,7 +192,7 @@
|
||||
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
|
||||
|
@ -198,8 +198,8 @@
|
||||
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
|
||||
|
@ -433,8 +433,8 @@
|
||||
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
|
||||
|
@ -372,8 +372,8 @@
|
||||
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
|
||||
|
@ -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) */
|
||||
|
@ -147,7 +147,7 @@
|
||||
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
|
||||
@ -425,7 +425,7 @@
|
||||
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
|
||||
|
@ -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 *);
|
||||
|
@ -376,8 +376,8 @@
|
||||
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
|
||||
|
@ -396,8 +396,8 @@
|
||||
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
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
79
net/compat.c
79
net/compat.c
@ -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]);
|
||||
|
25
net/socket.c
25
net/socket.c
@ -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;
|
||||
|
@ -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
|
||||
|
@ -427,8 +427,8 @@
|
||||
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
|
||||
|
@ -372,8 +372,8 @@
|
||||
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
|
||||
|
@ -396,8 +396,8 @@
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user