diff options
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/net/socket.c b/net/socket.c index b0256cd222f8..c05d86e63abf 100644 --- a/net/socket.c +++ b/net/socket.c @@ -2128,6 +2128,20 @@ SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr, return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); } +int connect_socket(struct socket *sock, struct sockaddr_storage *address, + int addrlen, int flags) +{ + int err; + + err = security_socket_connect(sock, (struct sockaddr *)address, + addrlen); + if (err) + return err; + + return READ_ONCE(sock->ops)->connect(sock, (struct sockaddr_unsized *)address, + addrlen, flags); +} + /* * Attempt to connect to a socket with the server address. The address * is in user space so we verify it is OK and move it to kernel space. @@ -2144,23 +2158,13 @@ int __sys_connect_file(struct file *file, struct sockaddr_storage *address, int addrlen, int file_flags) { struct socket *sock; - int err; sock = sock_from_file(file); - if (!sock) { - err = -ENOTSOCK; - goto out; - } - - err = - security_socket_connect(sock, (struct sockaddr *)address, addrlen); - if (err) - goto out; + if (!sock) + return -ENOTSOCK; - err = READ_ONCE(sock->ops)->connect(sock, (struct sockaddr_unsized *)address, - addrlen, sock->file->f_flags | file_flags); -out: - return err; + return connect_socket(sock, address, addrlen, + sock->file->f_flags | file_flags); } int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen) |
