History

net: add __sys_connect_file() helper

This is identical to __sys_connect(), except it takes a struct file instead of an fd, and it also allows passing in extra file->f_flags flags. The latter is done to support masking in O_NONBLOCK without manipulating the original file flags. No functional changes in this patch.

Jens Axboe committed 6 years ago

Commit bd3ded31 parent c4a2ed72 files · +25 −8Browse files

Unified · Split

2 files
  1. include/linux/socket.h +3 −0
  2. net/socket.c +22 −8
include/linux/socket.h+3−0
@@ -399,6 +399,9 @@ extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, · 398 unmodified lines
399399 int __user *upeer_addrlen, int flags);
400400 extern int __sys_socket(int family, int type, int protocol);
401401 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
402+extern int __sys_connect_file(struct file *file,
403+ struct sockaddr __user *uservaddr, int addrlen,
404+ int file_flags);
402405 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
403406 int addrlen);
404407 extern int __sys_listen(int fd, int backlog);
net/socket.c+22−8
@@ -1825,32 +1825,46 @@ SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr, · 1824 unmodified lines
18251825 * include the -EINPROGRESS status for such sockets.
18261826 */
18271827
1828−int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
1828+int __sys_connect_file(struct file *file, struct sockaddr __user *uservaddr,
1829+ int addrlen, int file_flags)
18291830 {
18301831 struct socket *sock;
18311832 struct sockaddr_storage address;
1832− int err, fput_needed;
1833+ int err;
18331834
1834− sock = sockfd_lookup_light(fd, &err, &fput_needed);
1835+ sock = sock_from_file(file, &err);
18351836 if (!sock)
18361837 goto out;
18371838 err = move_addr_to_kernel(uservaddr, addrlen, &address);
18381839 if (err < 0)
1839− goto out_put;
1840+ goto out;
18401841
18411842 err =
18421843 security_socket_connect(sock, (struct sockaddr *)&address, addrlen);
18431844 if (err)
1844− goto out_put;
1845+ goto out;
18451846
18461847 err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen,
1847− sock->file->f_flags);
1848−out_put:
1849− fput_light(sock->file, fput_needed);
1848+ sock->file->f_flags | file_flags);
18501849 out:
18511850 return err;
18521851 }
18531852
1853+int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
1854+{
1855+ int ret = -EBADF;
1856+ struct fd f;
1857+
1858+ f = fdget(fd);
1859+ if (f.file) {
1860+ ret = __sys_connect_file(f.file, uservaddr, addrlen, 0);
1861+ if (f.flags)
1862+ fput(f.file);
1863+ }
1864+
1865+ return ret;
1866+}
1867+
18541868 SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
18551869 int, addrlen)
18561870 {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t