hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/socket.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * NET An implementation of the SOCKET network access protocol.
34 *
....@@ -45,13 +46,6 @@
4546 * Tigran Aivazian : Made listen(2) backlog sanity checks
4647 * protocol-independent
4748 *
48
- *
49
- * This program is free software; you can redistribute it and/or
50
- * modify it under the terms of the GNU General Public License
51
- * as published by the Free Software Foundation; either version
52
- * 2 of the License, or (at your option) any later version.
53
- *
54
- *
5549 * This module is effectively the top level interface to the BSD socket
5650 * paradigm.
5751 *
....@@ -79,6 +73,7 @@
7973 #include <linux/module.h>
8074 #include <linux/highmem.h>
8175 #include <linux/mount.h>
76
+#include <linux/pseudo_fs.h>
8277 #include <linux/security.h>
8378 #include <linux/syscalls.h>
8479 #include <linux/compat.h>
....@@ -90,6 +85,7 @@
9085 #include <linux/slab.h>
9186 #include <linux/xattr.h>
9287 #include <linux/nospec.h>
88
+#include <linux/indirect_call_wrapper.h>
9389
9490 #include <linux/uaccess.h>
9591 #include <asm/unistd.h>
....@@ -104,6 +100,7 @@
104100 #include <linux/if_tun.h>
105101 #include <linux/ipv6_route.h>
106102 #include <linux/route.h>
103
+#include <linux/termios.h>
107104 #include <linux/sockios.h>
108105 #include <net/busy_poll.h>
109106 #include <linux/errqueue.h>
....@@ -132,6 +129,18 @@
132129 struct pipe_inode_info *pipe, size_t len,
133130 unsigned int flags);
134131
132
+#ifdef CONFIG_PROC_FS
133
+static void sock_show_fdinfo(struct seq_file *m, struct file *f)
134
+{
135
+ struct socket *sock = f->private_data;
136
+
137
+ if (sock->ops->show_fdinfo)
138
+ sock->ops->show_fdinfo(m, sock);
139
+}
140
+#else
141
+#define sock_show_fdinfo NULL
142
+#endif
143
+
135144 /*
136145 * Socket files have a set of 'special' operations as well as the generic file ones. These don't appear
137146 * in the operation structures but are done directly via the socketcall() multiplexor.
....@@ -153,6 +162,7 @@
153162 .sendpage = sock_sendpage,
154163 .splice_write = generic_splice_sendpage,
155164 .splice_read = sock_splice_read,
165
+ .show_fdinfo = sock_show_fdinfo,
156166 };
157167
158168 /*
....@@ -239,20 +249,13 @@
239249 static struct inode *sock_alloc_inode(struct super_block *sb)
240250 {
241251 struct socket_alloc *ei;
242
- struct socket_wq *wq;
243252
244253 ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL);
245254 if (!ei)
246255 return NULL;
247
- wq = kmalloc(sizeof(*wq), GFP_KERNEL);
248
- if (!wq) {
249
- kmem_cache_free(sock_inode_cachep, ei);
250
- return NULL;
251
- }
252
- init_waitqueue_head(&wq->wait);
253
- wq->fasync_list = NULL;
254
- wq->flags = 0;
255
- ei->socket.wq = wq;
256
+ init_waitqueue_head(&ei->socket.wq.wait);
257
+ ei->socket.wq.fasync_list = NULL;
258
+ ei->socket.wq.flags = 0;
256259
257260 ei->socket.state = SS_UNCONNECTED;
258261 ei->socket.flags = 0;
....@@ -263,12 +266,11 @@
263266 return &ei->vfs_inode;
264267 }
265268
266
-static void sock_destroy_inode(struct inode *inode)
269
+static void sock_free_inode(struct inode *inode)
267270 {
268271 struct socket_alloc *ei;
269272
270273 ei = container_of(inode, struct socket_alloc, vfs_inode);
271
- kfree_rcu(ei->socket.wq, rcu);
272274 kmem_cache_free(sock_inode_cachep, ei);
273275 }
274276
....@@ -293,7 +295,7 @@
293295
294296 static const struct super_operations sockfs_ops = {
295297 .alloc_inode = sock_alloc_inode,
296
- .destroy_inode = sock_destroy_inode,
298
+ .free_inode = sock_free_inode,
297299 .statfs = simple_statfs,
298300 };
299301
....@@ -312,7 +314,8 @@
312314
313315 static int sockfs_xattr_get(const struct xattr_handler *handler,
314316 struct dentry *dentry, struct inode *inode,
315
- const char *suffix, void *value, size_t size)
317
+ const char *suffix, void *value, size_t size,
318
+ int flags)
316319 {
317320 if (value) {
318321 if (dentry->d_name.len + 1 > size)
....@@ -351,19 +354,22 @@
351354 NULL
352355 };
353356
354
-static struct dentry *sockfs_mount(struct file_system_type *fs_type,
355
- int flags, const char *dev_name, void *data)
357
+static int sockfs_init_fs_context(struct fs_context *fc)
356358 {
357
- return mount_pseudo_xattr(fs_type, "socket:", &sockfs_ops,
358
- sockfs_xattr_handlers,
359
- &sockfs_dentry_operations, SOCKFS_MAGIC);
359
+ struct pseudo_fs_context *ctx = init_pseudo(fc, SOCKFS_MAGIC);
360
+ if (!ctx)
361
+ return -ENOMEM;
362
+ ctx->ops = &sockfs_ops;
363
+ ctx->dops = &sockfs_dentry_operations;
364
+ ctx->xattr = sockfs_xattr_handlers;
365
+ return 0;
360366 }
361367
362368 static struct vfsmount *sock_mnt __read_mostly;
363369
364370 static struct file_system_type sock_fs_type = {
365371 .name = "sockfs",
366
- .mount = sockfs_mount,
372
+ .init_fs_context = sockfs_init_fs_context,
367373 .kill_sb = kill_anon_super,
368374 };
369375
....@@ -413,6 +419,7 @@
413419
414420 sock->file = file;
415421 file->private_data = sock;
422
+ stream_open(SOCK_INODE(sock), file);
416423 return file;
417424 }
418425 EXPORT_SYMBOL(sock_alloc_file);
....@@ -427,7 +434,7 @@
427434 }
428435
429436 newfile = sock_alloc_file(sock, flags, NULL);
430
- if (likely(!IS_ERR(newfile))) {
437
+ if (!IS_ERR(newfile)) {
431438 fd_install(fd, newfile);
432439 return fd;
433440 }
....@@ -580,15 +587,6 @@
580587 }
581588 EXPORT_SYMBOL(sock_alloc);
582589
583
-/**
584
- * sock_release - close a socket
585
- * @sock: socket to close
586
- *
587
- * The socket is released from the protocol stack if it has a release
588
- * callback, and the inode is then released if the socket is bound to
589
- * an inode not a file.
590
- */
591
-
592590 static void __sock_release(struct socket *sock, struct inode *inode)
593591 {
594592 if (sock->ops) {
....@@ -604,7 +602,7 @@
604602 module_put(owner);
605603 }
606604
607
- if (sock->wq->fasync_list)
605
+ if (sock->wq.fasync_list)
608606 pr_err("%s: fasync list not empty!\n", __func__);
609607
610608 if (!sock->file) {
....@@ -614,6 +612,14 @@
614612 sock->file = NULL;
615613 }
616614
615
+/**
616
+ * sock_release - close a socket
617
+ * @sock: socket to close
618
+ *
619
+ * The socket is released from the protocol stack if it has a release
620
+ * callback, and the inode is then released if the socket is bound to
621
+ * an inode not a file.
622
+ */
617623 void sock_release(struct socket *sock)
618624 {
619625 __sock_release(sock, NULL);
....@@ -637,6 +643,27 @@
637643 }
638644 EXPORT_SYMBOL(__sock_tx_timestamp);
639645
646
+INDIRECT_CALLABLE_DECLARE(int inet_sendmsg(struct socket *, struct msghdr *,
647
+ size_t));
648
+INDIRECT_CALLABLE_DECLARE(int inet6_sendmsg(struct socket *, struct msghdr *,
649
+ size_t));
650
+static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
651
+{
652
+ int ret = INDIRECT_CALL_INET(sock->ops->sendmsg, inet6_sendmsg,
653
+ inet_sendmsg, sock, msg,
654
+ msg_data_left(msg));
655
+ BUG_ON(ret == -EIOCBQUEUED);
656
+ return ret;
657
+}
658
+
659
+static int __sock_sendmsg(struct socket *sock, struct msghdr *msg)
660
+{
661
+ int err = security_socket_sendmsg(sock, msg,
662
+ msg_data_left(msg));
663
+
664
+ return err ?: sock_sendmsg_nosec(sock, msg);
665
+}
666
+
640667 /**
641668 * sock_sendmsg - send a message through @sock
642669 * @sock: socket
....@@ -645,20 +672,21 @@
645672 * Sends @msg through @sock, passing through LSM.
646673 * Returns the number of bytes sent, or an error code.
647674 */
648
-
649
-static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
650
-{
651
- int ret = sock->ops->sendmsg(sock, msg, msg_data_left(msg));
652
- BUG_ON(ret == -EIOCBQUEUED);
653
- return ret;
654
-}
655
-
656675 int sock_sendmsg(struct socket *sock, struct msghdr *msg)
657676 {
658
- int err = security_socket_sendmsg(sock, msg,
659
- msg_data_left(msg));
677
+ struct sockaddr_storage *save_addr = (struct sockaddr_storage *)msg->msg_name;
678
+ struct sockaddr_storage address;
679
+ int ret;
660680
661
- return err ?: sock_sendmsg_nosec(sock, msg);
681
+ if (msg->msg_name) {
682
+ memcpy(&address, msg->msg_name, msg->msg_namelen);
683
+ msg->msg_name = &address;
684
+ }
685
+
686
+ ret = __sock_sendmsg(sock, msg);
687
+ msg->msg_name = save_addr;
688
+
689
+ return ret;
662690 }
663691 EXPORT_SYMBOL(sock_sendmsg);
664692
....@@ -677,7 +705,7 @@
677705 int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
678706 struct kvec *vec, size_t num, size_t size)
679707 {
680
- iov_iter_kvec(&msg->msg_iter, WRITE | ITER_KVEC, vec, num, size);
708
+ iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
681709 return sock_sendmsg(sock, msg);
682710 }
683711 EXPORT_SYMBOL(kernel_sendmsg);
....@@ -703,7 +731,7 @@
703731 if (!sock->ops->sendmsg_locked)
704732 return sock_no_sendmsg_locked(sk, msg, size);
705733
706
- iov_iter_kvec(&msg->msg_iter, WRITE | ITER_KVEC, vec, num, size);
734
+ iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
707735
708736 return sock->ops->sendmsg_locked(sk, msg, msg_data_left(msg));
709737 }
....@@ -724,7 +752,7 @@
724752 * before the software timestamp is received, a hardware TX timestamp may be
725753 * returned only if there is no software TX timestamp. Ignore false software
726754 * timestamps, which may be made in the __sock_recv_timestamp() call when the
727
- * option SO_TIMESTAMP(NS) is enabled on the socket, even when the skb has a
755
+ * option SO_TIMESTAMP_OLD(NS) is enabled on the socket, even when the skb has a
728756 * hardware timestamp.
729757 */
730758 static bool skb_is_swtx_tstamp(const struct sk_buff *skb, int false_tstamp)
....@@ -760,7 +788,9 @@
760788 struct sk_buff *skb)
761789 {
762790 int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP);
763
- struct scm_timestamping tss;
791
+ int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW);
792
+ struct scm_timestamping_internal tss;
793
+
764794 int empty = 1, false_tstamp = 0;
765795 struct skb_shared_hwtstamps *shhwtstamps =
766796 skb_hwtstamps(skb);
....@@ -774,34 +804,54 @@
774804
775805 if (need_software_tstamp) {
776806 if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) {
777
- struct timeval tv;
778
- skb_get_timestamp(skb, &tv);
779
- put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP,
780
- sizeof(tv), &tv);
807
+ if (new_tstamp) {
808
+ struct __kernel_sock_timeval tv;
809
+
810
+ skb_get_new_timestamp(skb, &tv);
811
+ put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_NEW,
812
+ sizeof(tv), &tv);
813
+ } else {
814
+ struct __kernel_old_timeval tv;
815
+
816
+ skb_get_timestamp(skb, &tv);
817
+ put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_OLD,
818
+ sizeof(tv), &tv);
819
+ }
781820 } else {
782
- struct timespec ts;
783
- skb_get_timestampns(skb, &ts);
784
- put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS,
785
- sizeof(ts), &ts);
821
+ if (new_tstamp) {
822
+ struct __kernel_timespec ts;
823
+
824
+ skb_get_new_timestampns(skb, &ts);
825
+ put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_NEW,
826
+ sizeof(ts), &ts);
827
+ } else {
828
+ struct __kernel_old_timespec ts;
829
+
830
+ skb_get_timestampns(skb, &ts);
831
+ put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_OLD,
832
+ sizeof(ts), &ts);
833
+ }
786834 }
787835 }
788836
789837 memset(&tss, 0, sizeof(tss));
790838 if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) &&
791
- ktime_to_timespec_cond(skb->tstamp, tss.ts + 0))
839
+ ktime_to_timespec64_cond(skb->tstamp, tss.ts + 0))
792840 empty = 0;
793841 if (shhwtstamps &&
794842 (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
795843 !skb_is_swtx_tstamp(skb, false_tstamp) &&
796
- ktime_to_timespec_cond(shhwtstamps->hwtstamp, tss.ts + 2)) {
844
+ ktime_to_timespec64_cond(shhwtstamps->hwtstamp, tss.ts + 2)) {
797845 empty = 0;
798846 if ((sk->sk_tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) &&
799847 !skb_is_err_queue(skb))
800848 put_ts_pktinfo(msg, skb);
801849 }
802850 if (!empty) {
803
- put_cmsg(msg, SOL_SOCKET,
804
- SCM_TIMESTAMPING, sizeof(tss), &tss);
851
+ if (sock_flag(sk, SOCK_TSTAMP_NEW))
852
+ put_cmsg_scm_timestamping64(msg, &tss);
853
+ else
854
+ put_cmsg_scm_timestamping(msg, &tss);
805855
806856 if (skb_is_err_queue(skb) && skb->len &&
807857 SKB_EXT_ERR(skb)->opt_stats)
....@@ -843,6 +893,18 @@
843893 }
844894 EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
845895
896
+INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
897
+ size_t, int));
898
+INDIRECT_CALLABLE_DECLARE(int inet6_recvmsg(struct socket *, struct msghdr *,
899
+ size_t, int));
900
+static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
901
+ int flags)
902
+{
903
+ return INDIRECT_CALL_INET(sock->ops->recvmsg, inet6_recvmsg,
904
+ inet_recvmsg, sock, msg, msg_data_left(msg),
905
+ flags);
906
+}
907
+
846908 /**
847909 * sock_recvmsg - receive a message from @sock
848910 * @sock: socket
....@@ -852,13 +914,6 @@
852914 * Receives @msg from @sock, passing through LSM. Returns the total number
853915 * of bytes received, or an error.
854916 */
855
-
856
-static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
857
- int flags)
858
-{
859
- return sock->ops->recvmsg(sock, msg, msg_data_left(msg), flags);
860
-}
861
-
862917 int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags)
863918 {
864919 int err = security_socket_recvmsg(sock, msg, msg_data_left(msg), flags);
....@@ -886,14 +941,9 @@
886941 int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
887942 struct kvec *vec, size_t num, size_t size, int flags)
888943 {
889
- mm_segment_t oldfs = get_fs();
890
- int result;
891
-
892
- iov_iter_kvec(&msg->msg_iter, READ | ITER_KVEC, vec, num, size);
893
- set_fs(KERNEL_DS);
894
- result = sock_recvmsg(sock, msg, flags);
895
- set_fs(oldfs);
896
- return result;
944
+ msg->msg_control_is_user = false;
945
+ iov_iter_kvec(&msg->msg_iter, READ, vec, num, size);
946
+ return sock_recvmsg(sock, msg, flags);
897947 }
898948 EXPORT_SYMBOL(kernel_recvmsg);
899949
....@@ -919,7 +969,7 @@
919969 struct socket *sock = file->private_data;
920970
921971 if (unlikely(!sock->ops->splice_read))
922
- return -EINVAL;
972
+ return generic_file_splice_read(file, ppos, pipe, len, flags);
923973
924974 return sock->ops->splice_read(sock, ppos, pipe, len, flags);
925975 }
....@@ -963,7 +1013,7 @@
9631013 if (sock->type == SOCK_SEQPACKET)
9641014 msg.msg_flags |= MSG_EOR;
9651015
966
- res = sock_sendmsg(sock, &msg);
1016
+ res = __sock_sendmsg(sock, &msg);
9671017 *from = msg.msg_iter;
9681018 return res;
9691019 }
....@@ -1131,6 +1181,26 @@
11311181
11321182 err = open_related_ns(&net->ns, get_net_ns);
11331183 break;
1184
+ case SIOCGSTAMP_OLD:
1185
+ case SIOCGSTAMPNS_OLD:
1186
+ if (!sock->ops->gettstamp) {
1187
+ err = -ENOIOCTLCMD;
1188
+ break;
1189
+ }
1190
+ err = sock->ops->gettstamp(sock, argp,
1191
+ cmd == SIOCGSTAMP_OLD,
1192
+ !IS_ENABLED(CONFIG_64BIT));
1193
+ break;
1194
+ case SIOCGSTAMP_NEW:
1195
+ case SIOCGSTAMPNS_NEW:
1196
+ if (!sock->ops->gettstamp) {
1197
+ err = -ENOIOCTLCMD;
1198
+ break;
1199
+ }
1200
+ err = sock->ops->gettstamp(sock, argp,
1201
+ cmd == SIOCGSTAMP_NEW,
1202
+ false);
1203
+ break;
11341204 default:
11351205 err = sock_do_ioctl(net, sock, cmd, arg);
11361206 break;
....@@ -1230,13 +1300,12 @@
12301300 {
12311301 struct socket *sock = filp->private_data;
12321302 struct sock *sk = sock->sk;
1233
- struct socket_wq *wq;
1303
+ struct socket_wq *wq = &sock->wq;
12341304
12351305 if (sk == NULL)
12361306 return -EINVAL;
12371307
12381308 lock_sock(sk);
1239
- wq = sock->wq;
12401309 fasync_helper(fd, filp, on, &wq->fasync_list);
12411310
12421311 if (!wq->fasync_list)
....@@ -1263,7 +1332,7 @@
12631332 case SOCK_WAKE_SPACE:
12641333 if (!test_and_clear_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags))
12651334 break;
1266
- /* fall through */
1335
+ fallthrough;
12671336 case SOCK_WAKE_IO:
12681337 call_kill:
12691338 kill_fasync(&wq->fasync_list, SIGIO, band);
....@@ -1586,7 +1655,7 @@
15861655 sock = sockfd_lookup_light(fd, &err, &fput_needed);
15871656 if (sock) {
15881657 err = move_addr_to_kernel(umyaddr, addrlen, &address);
1589
- if (err >= 0) {
1658
+ if (!err) {
15901659 err = security_socket_bind(sock,
15911660 (struct sockaddr *)&address,
15921661 addrlen);
....@@ -1619,7 +1688,7 @@
16191688
16201689 sock = sockfd_lookup_light(fd, &err, &fput_needed);
16211690 if (sock) {
1622
- somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
1691
+ somaxconn = READ_ONCE(sock_net(sock->sk)->core.sysctl_somaxconn);
16231692 if ((unsigned int)backlog > somaxconn)
16241693 backlog = somaxconn;
16251694
....@@ -1637,40 +1706,22 @@
16371706 return __sys_listen(fd, backlog);
16381707 }
16391708
1640
-/*
1641
- * For accept, we attempt to create a new socket, set up the link
1642
- * with the client, wake up the client, then return the new
1643
- * connected fd. We collect the address of the connector in kernel
1644
- * space and move it to user at the very end. This is unclean because
1645
- * we open the socket then return an error.
1646
- *
1647
- * 1003.1g adds the ability to recvmsg() to query connection pending
1648
- * status to recvmsg. We need to add that support in a way thats
1649
- * clean when we restructure accept also.
1650
- */
1651
-
1652
-int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
1653
- int __user *upeer_addrlen, int flags)
1709
+struct file *do_accept(struct file *file, unsigned file_flags,
1710
+ struct sockaddr __user *upeer_sockaddr,
1711
+ int __user *upeer_addrlen, int flags)
16541712 {
16551713 struct socket *sock, *newsock;
16561714 struct file *newfile;
1657
- int err, len, newfd, fput_needed;
1715
+ int err, len;
16581716 struct sockaddr_storage address;
16591717
1660
- if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1661
- return -EINVAL;
1662
-
1663
- if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1664
- flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1665
-
1666
- sock = sockfd_lookup_light(fd, &err, &fput_needed);
1718
+ sock = sock_from_file(file, &err);
16671719 if (!sock)
1668
- goto out;
1720
+ return ERR_PTR(err);
16691721
1670
- err = -ENFILE;
16711722 newsock = sock_alloc();
16721723 if (!newsock)
1673
- goto out_put;
1724
+ return ERR_PTR(-ENFILE);
16741725
16751726 newsock->type = sock->type;
16761727 newsock->ops = sock->ops;
....@@ -1681,24 +1732,16 @@
16811732 */
16821733 __module_get(newsock->ops->owner);
16831734
1684
- newfd = get_unused_fd_flags(flags);
1685
- if (unlikely(newfd < 0)) {
1686
- err = newfd;
1687
- sock_release(newsock);
1688
- goto out_put;
1689
- }
16901735 newfile = sock_alloc_file(newsock, flags, sock->sk->sk_prot_creator->name);
1691
- if (IS_ERR(newfile)) {
1692
- err = PTR_ERR(newfile);
1693
- put_unused_fd(newfd);
1694
- goto out_put;
1695
- }
1736
+ if (IS_ERR(newfile))
1737
+ return newfile;
16961738
16971739 err = security_socket_accept(sock, newsock);
16981740 if (err)
16991741 goto out_fd;
17001742
1701
- err = sock->ops->accept(sock, newsock, sock->file->f_flags, false);
1743
+ err = sock->ops->accept(sock, newsock, sock->file->f_flags | file_flags,
1744
+ false);
17021745 if (err < 0)
17031746 goto out_fd;
17041747
....@@ -1716,18 +1759,67 @@
17161759 }
17171760
17181761 /* File flags are not inherited via accept() unlike another OSes. */
1719
-
1720
- fd_install(newfd, newfile);
1721
- err = newfd;
1722
-
1723
-out_put:
1724
- fput_light(sock->file, fput_needed);
1725
-out:
1726
- return err;
1762
+ return newfile;
17271763 out_fd:
17281764 fput(newfile);
1729
- put_unused_fd(newfd);
1730
- goto out_put;
1765
+ return ERR_PTR(err);
1766
+}
1767
+
1768
+int __sys_accept4_file(struct file *file, unsigned file_flags,
1769
+ struct sockaddr __user *upeer_sockaddr,
1770
+ int __user *upeer_addrlen, int flags,
1771
+ unsigned long nofile)
1772
+{
1773
+ struct file *newfile;
1774
+ int newfd;
1775
+
1776
+ if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1777
+ return -EINVAL;
1778
+
1779
+ if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1780
+ flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1781
+
1782
+ newfd = __get_unused_fd_flags(flags, nofile);
1783
+ if (unlikely(newfd < 0))
1784
+ return newfd;
1785
+
1786
+ newfile = do_accept(file, file_flags, upeer_sockaddr, upeer_addrlen,
1787
+ flags);
1788
+ if (IS_ERR(newfile)) {
1789
+ put_unused_fd(newfd);
1790
+ return PTR_ERR(newfile);
1791
+ }
1792
+ fd_install(newfd, newfile);
1793
+ return newfd;
1794
+}
1795
+
1796
+/*
1797
+ * For accept, we attempt to create a new socket, set up the link
1798
+ * with the client, wake up the client, then return the new
1799
+ * connected fd. We collect the address of the connector in kernel
1800
+ * space and move it to user at the very end. This is unclean because
1801
+ * we open the socket then return an error.
1802
+ *
1803
+ * 1003.1g adds the ability to recvmsg() to query connection pending
1804
+ * status to recvmsg. We need to add that support in a way thats
1805
+ * clean when we restructure accept also.
1806
+ */
1807
+
1808
+int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
1809
+ int __user *upeer_addrlen, int flags)
1810
+{
1811
+ int ret = -EBADF;
1812
+ struct fd f;
1813
+
1814
+ f = fdget(fd);
1815
+ if (f.file) {
1816
+ ret = __sys_accept4_file(f.file, 0, upeer_sockaddr,
1817
+ upeer_addrlen, flags,
1818
+ rlimit(RLIMIT_NOFILE));
1819
+ fdput(f);
1820
+ }
1821
+
1822
+ return ret;
17311823 }
17321824
17331825 SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
....@@ -1754,30 +1846,43 @@
17541846 * include the -EINPROGRESS status for such sockets.
17551847 */
17561848
1757
-int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
1849
+int __sys_connect_file(struct file *file, struct sockaddr_storage *address,
1850
+ int addrlen, int file_flags)
17581851 {
17591852 struct socket *sock;
1760
- struct sockaddr_storage address;
1761
- int err, fput_needed;
1853
+ int err;
17621854
1763
- sock = sockfd_lookup_light(fd, &err, &fput_needed);
1855
+ sock = sock_from_file(file, &err);
17641856 if (!sock)
17651857 goto out;
1766
- err = move_addr_to_kernel(uservaddr, addrlen, &address);
1767
- if (err < 0)
1768
- goto out_put;
17691858
17701859 err =
1771
- security_socket_connect(sock, (struct sockaddr *)&address, addrlen);
1860
+ security_socket_connect(sock, (struct sockaddr *)address, addrlen);
17721861 if (err)
1773
- goto out_put;
1862
+ goto out;
17741863
1775
- err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen,
1776
- sock->file->f_flags);
1777
-out_put:
1778
- fput_light(sock->file, fput_needed);
1864
+ err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen,
1865
+ sock->file->f_flags | file_flags);
17791866 out:
17801867 return err;
1868
+}
1869
+
1870
+int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
1871
+{
1872
+ int ret = -EBADF;
1873
+ struct fd f;
1874
+
1875
+ f = fdget(fd);
1876
+ if (f.file) {
1877
+ struct sockaddr_storage address;
1878
+
1879
+ ret = move_addr_to_kernel(uservaddr, addrlen, &address);
1880
+ if (!ret)
1881
+ ret = __sys_connect_file(f.file, &address, addrlen, 0);
1882
+ fdput(f);
1883
+ }
1884
+
1885
+ return ret;
17811886 }
17821887
17831888 SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
....@@ -1896,7 +2001,7 @@
18962001 if (sock->file->f_flags & O_NONBLOCK)
18972002 flags |= MSG_DONTWAIT;
18982003 msg.msg_flags = flags;
1899
- err = sock_sendmsg(sock, &msg);
2004
+ err = __sock_sendmsg(sock, &msg);
19002005
19012006 out_put:
19022007 fput_light(sock->file, fput_needed);
....@@ -1984,14 +2089,26 @@
19842089 return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
19852090 }
19862091
2092
+static bool sock_use_custom_sol_socket(const struct socket *sock)
2093
+{
2094
+ const struct sock *sk = sock->sk;
2095
+
2096
+ /* Use sock->ops->setsockopt() for MPTCP */
2097
+ return IS_ENABLED(CONFIG_MPTCP) &&
2098
+ sk->sk_protocol == IPPROTO_MPTCP &&
2099
+ sk->sk_type == SOCK_STREAM &&
2100
+ (sk->sk_family == AF_INET || sk->sk_family == AF_INET6);
2101
+}
2102
+
19872103 /*
19882104 * Set a socket option. Because we don't know the option lengths we have
19892105 * to pass the user mode parameter for the protocols to sort out.
19902106 */
1991
-
1992
-static int __sys_setsockopt(int fd, int level, int optname,
1993
- char __user *optval, int optlen)
2107
+int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,
2108
+ int optlen)
19942109 {
2110
+ sockptr_t optval = USER_SOCKPTR(user_optval);
2111
+ char *kernel_optval = NULL;
19952112 int err, fput_needed;
19962113 struct socket *sock;
19972114
....@@ -1999,22 +2116,36 @@
19992116 return -EINVAL;
20002117
20012118 sock = sockfd_lookup_light(fd, &err, &fput_needed);
2002
- if (sock != NULL) {
2003
- err = security_socket_setsockopt(sock, level, optname);
2004
- if (err)
2005
- goto out_put;
2119
+ if (!sock)
2120
+ return err;
20062121
2007
- if (level == SOL_SOCKET)
2008
- err =
2009
- sock_setsockopt(sock, level, optname, optval,
2010
- optlen);
2011
- else
2012
- err =
2013
- sock->ops->setsockopt(sock, level, optname, optval,
2014
- optlen);
2015
-out_put:
2016
- fput_light(sock->file, fput_needed);
2122
+ err = security_socket_setsockopt(sock, level, optname);
2123
+ if (err)
2124
+ goto out_put;
2125
+
2126
+ if (!in_compat_syscall())
2127
+ err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname,
2128
+ user_optval, &optlen,
2129
+ &kernel_optval);
2130
+ if (err < 0)
2131
+ goto out_put;
2132
+ if (err > 0) {
2133
+ err = 0;
2134
+ goto out_put;
20172135 }
2136
+
2137
+ if (kernel_optval)
2138
+ optval = KERNEL_SOCKPTR(kernel_optval);
2139
+ if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock))
2140
+ err = sock_setsockopt(sock, level, optname, optval, optlen);
2141
+ else if (unlikely(!sock->ops->setsockopt))
2142
+ err = -EOPNOTSUPP;
2143
+ else
2144
+ err = sock->ops->setsockopt(sock, level, optname, optval,
2145
+ optlen);
2146
+ kfree(kernel_optval);
2147
+out_put:
2148
+ fput_light(sock->file, fput_needed);
20182149 return err;
20192150 }
20202151
....@@ -2028,30 +2159,38 @@
20282159 * Get a socket option. Because we don't know the option lengths we have
20292160 * to pass a user mode parameter for the protocols to sort out.
20302161 */
2031
-
2032
-static int __sys_getsockopt(int fd, int level, int optname,
2033
- char __user *optval, int __user *optlen)
2162
+int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
2163
+ int __user *optlen)
20342164 {
20352165 int err, fput_needed;
20362166 struct socket *sock;
2167
+ int max_optlen;
20372168
20382169 sock = sockfd_lookup_light(fd, &err, &fput_needed);
2039
- if (sock != NULL) {
2040
- err = security_socket_getsockopt(sock, level, optname);
2041
- if (err)
2042
- goto out_put;
2170
+ if (!sock)
2171
+ return err;
20432172
2044
- if (level == SOL_SOCKET)
2045
- err =
2046
- sock_getsockopt(sock, level, optname, optval,
2173
+ err = security_socket_getsockopt(sock, level, optname);
2174
+ if (err)
2175
+ goto out_put;
2176
+
2177
+ if (!in_compat_syscall())
2178
+ max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
2179
+
2180
+ if (level == SOL_SOCKET)
2181
+ err = sock_getsockopt(sock, level, optname, optval, optlen);
2182
+ else if (unlikely(!sock->ops->getsockopt))
2183
+ err = -EOPNOTSUPP;
2184
+ else
2185
+ err = sock->ops->getsockopt(sock, level, optname, optval,
20472186 optlen);
2048
- else
2049
- err =
2050
- sock->ops->getsockopt(sock, level, optname, optval,
2051
- optlen);
2187
+
2188
+ if (!in_compat_syscall())
2189
+ err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname,
2190
+ optval, optlen, max_optlen,
2191
+ err);
20522192 out_put:
2053
- fput_light(sock->file, fput_needed);
2054
- }
2193
+ fput_light(sock->file, fput_needed);
20552194 return err;
20562195 }
20572196
....@@ -2065,6 +2204,17 @@
20652204 * Shutdown a socket.
20662205 */
20672206
2207
+int __sys_shutdown_sock(struct socket *sock, int how)
2208
+{
2209
+ int err;
2210
+
2211
+ err = security_socket_shutdown(sock, how);
2212
+ if (!err)
2213
+ err = sock->ops->shutdown(sock, how);
2214
+
2215
+ return err;
2216
+}
2217
+
20682218 int __sys_shutdown(int fd, int how)
20692219 {
20702220 int err, fput_needed;
....@@ -2072,9 +2222,7 @@
20722222
20732223 sock = sockfd_lookup_light(fd, &err, &fput_needed);
20742224 if (sock != NULL) {
2075
- err = security_socket_shutdown(sock, how);
2076
- if (!err)
2077
- err = sock->ops->shutdown(sock, how);
2225
+ err = __sys_shutdown_sock(sock, how);
20782226 fput_light(sock->file, fput_needed);
20792227 }
20802228 return err;
....@@ -2097,10 +2245,10 @@
20972245 unsigned int name_len;
20982246 };
20992247
2100
-static int copy_msghdr_from_user(struct msghdr *kmsg,
2101
- struct user_msghdr __user *umsg,
2102
- struct sockaddr __user **save_addr,
2103
- struct iovec **iov)
2248
+int __copy_msghdr_from_user(struct msghdr *kmsg,
2249
+ struct user_msghdr __user *umsg,
2250
+ struct sockaddr __user **save_addr,
2251
+ struct iovec __user **uiov, size_t *nsegs)
21042252 {
21052253 struct user_msghdr msg;
21062254 ssize_t err;
....@@ -2108,7 +2256,8 @@
21082256 if (copy_from_user(&msg, umsg, sizeof(*umsg)))
21092257 return -EFAULT;
21102258
2111
- kmsg->msg_control = (void __force *)msg.msg_control;
2259
+ kmsg->msg_control_is_user = true;
2260
+ kmsg->msg_control_user = msg.msg_control;
21122261 kmsg->msg_controllen = msg.msg_controllen;
21132262 kmsg->msg_flags = msg.msg_flags;
21142263
....@@ -2142,21 +2291,34 @@
21422291 return -EMSGSIZE;
21432292
21442293 kmsg->msg_iocb = NULL;
2145
-
2146
- return import_iovec(save_addr ? READ : WRITE,
2147
- msg.msg_iov, msg.msg_iovlen,
2148
- UIO_FASTIOV, iov, &kmsg->msg_iter);
2294
+ *uiov = msg.msg_iov;
2295
+ *nsegs = msg.msg_iovlen;
2296
+ return 0;
21492297 }
21502298
2151
-static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
2152
- struct msghdr *msg_sys, unsigned int flags,
2153
- struct used_address *used_address,
2154
- unsigned int allowed_msghdr_flags)
2299
+static int copy_msghdr_from_user(struct msghdr *kmsg,
2300
+ struct user_msghdr __user *umsg,
2301
+ struct sockaddr __user **save_addr,
2302
+ struct iovec **iov)
21552303 {
2156
- struct compat_msghdr __user *msg_compat =
2157
- (struct compat_msghdr __user *)msg;
2158
- struct sockaddr_storage address;
2159
- struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
2304
+ struct user_msghdr msg;
2305
+ ssize_t err;
2306
+
2307
+ err = __copy_msghdr_from_user(kmsg, umsg, save_addr, &msg.msg_iov,
2308
+ &msg.msg_iovlen);
2309
+ if (err)
2310
+ return err;
2311
+
2312
+ err = import_iovec(save_addr ? READ : WRITE,
2313
+ msg.msg_iov, msg.msg_iovlen,
2314
+ UIO_FASTIOV, iov, &kmsg->msg_iter);
2315
+ return err < 0 ? err : 0;
2316
+}
2317
+
2318
+static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys,
2319
+ unsigned int flags, struct used_address *used_address,
2320
+ unsigned int allowed_msghdr_flags)
2321
+{
21602322 unsigned char ctl[sizeof(struct cmsghdr) + 20]
21612323 __aligned(sizeof(__kernel_size_t));
21622324 /* 20 is size of ipv6_pktinfo */
....@@ -2164,19 +2326,10 @@
21642326 int ctl_len;
21652327 ssize_t err;
21662328
2167
- msg_sys->msg_name = &address;
2168
-
2169
- if (MSG_CMSG_COMPAT & flags)
2170
- err = get_compat_msghdr(msg_sys, msg_compat, NULL, &iov);
2171
- else
2172
- err = copy_msghdr_from_user(msg_sys, msg, NULL, &iov);
2173
- if (err < 0)
2174
- return err;
2175
-
21762329 err = -ENOBUFS;
21772330
21782331 if (msg_sys->msg_controllen > INT_MAX)
2179
- goto out_freeiov;
2332
+ goto out;
21802333 flags |= (msg_sys->msg_flags & allowed_msghdr_flags);
21812334 ctl_len = msg_sys->msg_controllen;
21822335 if ((MSG_CMSG_COMPAT & flags) && ctl_len) {
....@@ -2184,7 +2337,7 @@
21842337 cmsghdr_from_user_compat_to_kern(msg_sys, sock->sk, ctl,
21852338 sizeof(ctl));
21862339 if (err)
2187
- goto out_freeiov;
2340
+ goto out;
21882341 ctl_buf = msg_sys->msg_control;
21892342 ctl_len = msg_sys->msg_controllen;
21902343 } else if (ctl_len) {
....@@ -2193,19 +2346,13 @@
21932346 if (ctl_len > sizeof(ctl)) {
21942347 ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);
21952348 if (ctl_buf == NULL)
2196
- goto out_freeiov;
2349
+ goto out;
21972350 }
21982351 err = -EFAULT;
2199
- /*
2200
- * Careful! Before this, msg_sys->msg_control contains a user pointer.
2201
- * Afterwards, it will be a kernel pointer. Thus the compiler-assisted
2202
- * checking falls down on this.
2203
- */
2204
- if (copy_from_user(ctl_buf,
2205
- (void __user __force *)msg_sys->msg_control,
2206
- ctl_len))
2352
+ if (copy_from_user(ctl_buf, msg_sys->msg_control_user, ctl_len))
22072353 goto out_freectl;
22082354 msg_sys->msg_control = ctl_buf;
2355
+ msg_sys->msg_control_is_user = false;
22092356 }
22102357 msg_sys->msg_flags = flags;
22112358
....@@ -2224,7 +2371,7 @@
22242371 err = sock_sendmsg_nosec(sock, msg_sys);
22252372 goto out_freectl;
22262373 }
2227
- err = sock_sendmsg(sock, msg_sys);
2374
+ err = __sock_sendmsg(sock, msg_sys);
22282375 /*
22292376 * If this is sendmmsg() and sending to current destination address was
22302377 * successful, remember it.
....@@ -2239,7 +2386,47 @@
22392386 out_freectl:
22402387 if (ctl_buf != ctl)
22412388 sock_kfree_s(sock->sk, ctl_buf, ctl_len);
2242
-out_freeiov:
2389
+out:
2390
+ return err;
2391
+}
2392
+
2393
+int sendmsg_copy_msghdr(struct msghdr *msg,
2394
+ struct user_msghdr __user *umsg, unsigned flags,
2395
+ struct iovec **iov)
2396
+{
2397
+ int err;
2398
+
2399
+ if (flags & MSG_CMSG_COMPAT) {
2400
+ struct compat_msghdr __user *msg_compat;
2401
+
2402
+ msg_compat = (struct compat_msghdr __user *) umsg;
2403
+ err = get_compat_msghdr(msg, msg_compat, NULL, iov);
2404
+ } else {
2405
+ err = copy_msghdr_from_user(msg, umsg, NULL, iov);
2406
+ }
2407
+ if (err < 0)
2408
+ return err;
2409
+
2410
+ return 0;
2411
+}
2412
+
2413
+static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
2414
+ struct msghdr *msg_sys, unsigned int flags,
2415
+ struct used_address *used_address,
2416
+ unsigned int allowed_msghdr_flags)
2417
+{
2418
+ struct sockaddr_storage address;
2419
+ struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
2420
+ ssize_t err;
2421
+
2422
+ msg_sys->msg_name = &address;
2423
+
2424
+ err = sendmsg_copy_msghdr(msg_sys, msg, flags, &iov);
2425
+ if (err < 0)
2426
+ return err;
2427
+
2428
+ err = ____sys_sendmsg(sock, msg_sys, flags, used_address,
2429
+ allowed_msghdr_flags);
22432430 kfree(iov);
22442431 return err;
22452432 }
....@@ -2247,6 +2434,11 @@
22472434 /*
22482435 * BSD sendmsg interface
22492436 */
2437
+long __sys_sendmsg_sock(struct socket *sock, struct msghdr *msg,
2438
+ unsigned int flags)
2439
+{
2440
+ return ____sys_sendmsg(sock, msg, flags, NULL, 0);
2441
+}
22502442
22512443 long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
22522444 bool forbid_cmsg_compat)
....@@ -2351,33 +2543,41 @@
23512543 return __sys_sendmmsg(fd, mmsg, vlen, flags, true);
23522544 }
23532545
2354
-static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2355
- struct msghdr *msg_sys, unsigned int flags, int nosec)
2546
+int recvmsg_copy_msghdr(struct msghdr *msg,
2547
+ struct user_msghdr __user *umsg, unsigned flags,
2548
+ struct sockaddr __user **uaddr,
2549
+ struct iovec **iov)
2550
+{
2551
+ ssize_t err;
2552
+
2553
+ if (MSG_CMSG_COMPAT & flags) {
2554
+ struct compat_msghdr __user *msg_compat;
2555
+
2556
+ msg_compat = (struct compat_msghdr __user *) umsg;
2557
+ err = get_compat_msghdr(msg, msg_compat, uaddr, iov);
2558
+ } else {
2559
+ err = copy_msghdr_from_user(msg, umsg, uaddr, iov);
2560
+ }
2561
+ if (err < 0)
2562
+ return err;
2563
+
2564
+ return 0;
2565
+}
2566
+
2567
+static int ____sys_recvmsg(struct socket *sock, struct msghdr *msg_sys,
2568
+ struct user_msghdr __user *msg,
2569
+ struct sockaddr __user *uaddr,
2570
+ unsigned int flags, int nosec)
23562571 {
23572572 struct compat_msghdr __user *msg_compat =
2358
- (struct compat_msghdr __user *)msg;
2359
- struct iovec iovstack[UIO_FASTIOV];
2360
- struct iovec *iov = iovstack;
2573
+ (struct compat_msghdr __user *) msg;
2574
+ int __user *uaddr_len = COMPAT_NAMELEN(msg);
2575
+ struct sockaddr_storage addr;
23612576 unsigned long cmsg_ptr;
23622577 int len;
23632578 ssize_t err;
23642579
2365
- /* kernel mode address */
2366
- struct sockaddr_storage addr;
2367
-
2368
- /* user mode address pointers */
2369
- struct sockaddr __user *uaddr;
2370
- int __user *uaddr_len = COMPAT_NAMELEN(msg);
2371
-
23722580 msg_sys->msg_name = &addr;
2373
-
2374
- if (MSG_CMSG_COMPAT & flags)
2375
- err = get_compat_msghdr(msg_sys, msg_compat, &uaddr, &iov);
2376
- else
2377
- err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov);
2378
- if (err < 0)
2379
- return err;
2380
-
23812581 cmsg_ptr = (unsigned long)msg_sys->msg_control;
23822582 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
23832583
....@@ -2386,9 +2586,14 @@
23862586
23872587 if (sock->file->f_flags & O_NONBLOCK)
23882588 flags |= MSG_DONTWAIT;
2389
- err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys, flags);
2589
+
2590
+ if (unlikely(nosec))
2591
+ err = sock_recvmsg_nosec(sock, msg_sys, flags);
2592
+ else
2593
+ err = sock_recvmsg(sock, msg_sys, flags);
2594
+
23902595 if (err < 0)
2391
- goto out_freeiov;
2596
+ goto out;
23922597 len = err;
23932598
23942599 if (uaddr != NULL) {
....@@ -2396,12 +2601,12 @@
23962601 msg_sys->msg_namelen, uaddr,
23972602 uaddr_len);
23982603 if (err < 0)
2399
- goto out_freeiov;
2604
+ goto out;
24002605 }
24012606 err = __put_user((msg_sys->msg_flags & ~MSG_CMSG_COMPAT),
24022607 COMPAT_FLAGS(msg));
24032608 if (err)
2404
- goto out_freeiov;
2609
+ goto out;
24052610 if (MSG_CMSG_COMPAT & flags)
24062611 err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
24072612 &msg_compat->msg_controllen);
....@@ -2409,10 +2614,25 @@
24092614 err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
24102615 &msg->msg_controllen);
24112616 if (err)
2412
- goto out_freeiov;
2617
+ goto out;
24132618 err = len;
2619
+out:
2620
+ return err;
2621
+}
24142622
2415
-out_freeiov:
2623
+static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2624
+ struct msghdr *msg_sys, unsigned int flags, int nosec)
2625
+{
2626
+ struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
2627
+ /* user mode address pointers */
2628
+ struct sockaddr __user *uaddr;
2629
+ ssize_t err;
2630
+
2631
+ err = recvmsg_copy_msghdr(msg_sys, msg, flags, &uaddr, &iov);
2632
+ if (err < 0)
2633
+ return err;
2634
+
2635
+ err = ____sys_recvmsg(sock, msg_sys, msg, uaddr, flags, nosec);
24162636 kfree(iov);
24172637 return err;
24182638 }
....@@ -2420,6 +2640,13 @@
24202640 /*
24212641 * BSD recvmsg interface
24222642 */
2643
+
2644
+long __sys_recvmsg_sock(struct socket *sock, struct msghdr *msg,
2645
+ struct user_msghdr __user *umsg,
2646
+ struct sockaddr __user *uaddr, unsigned int flags)
2647
+{
2648
+ return ____sys_recvmsg(sock, msg, umsg, uaddr, flags, 0);
2649
+}
24232650
24242651 long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
24252652 bool forbid_cmsg_compat)
....@@ -2452,8 +2679,9 @@
24522679 * Linux recvmmsg interface
24532680 */
24542681
2455
-int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2456
- unsigned int flags, struct timespec *timeout)
2682
+static int do_recvmmsg(int fd, struct mmsghdr __user *mmsg,
2683
+ unsigned int vlen, unsigned int flags,
2684
+ struct timespec64 *timeout)
24572685 {
24582686 int fput_needed, err, datagrams;
24592687 struct socket *sock;
....@@ -2518,8 +2746,7 @@
25182746
25192747 if (timeout) {
25202748 ktime_get_ts64(&timeout64);
2521
- *timeout = timespec64_to_timespec(
2522
- timespec64_sub(end_time, timeout64));
2749
+ *timeout = timespec64_sub(end_time, timeout64);
25232750 if (timeout->tv_sec < 0) {
25242751 timeout->tv_sec = timeout->tv_nsec = 0;
25252752 break;
....@@ -2555,7 +2782,7 @@
25552782 * error to return on the next call or if the
25562783 * app asks about it using getsockopt(SO_ERROR).
25572784 */
2558
- sock->sk->sk_err = -err;
2785
+ WRITE_ONCE(sock->sk->sk_err, -err);
25592786 }
25602787 out_put:
25612788 fput_light(sock->file, fput_needed);
....@@ -2563,26 +2790,32 @@
25632790 return datagrams;
25642791 }
25652792
2566
-static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
2567
- unsigned int vlen, unsigned int flags,
2568
- struct timespec __user *timeout)
2793
+int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
2794
+ unsigned int vlen, unsigned int flags,
2795
+ struct __kernel_timespec __user *timeout,
2796
+ struct old_timespec32 __user *timeout32)
25692797 {
25702798 int datagrams;
2571
- struct timespec timeout_sys;
2799
+ struct timespec64 timeout_sys;
25722800
2573
- if (flags & MSG_CMSG_COMPAT)
2574
- return -EINVAL;
2575
-
2576
- if (!timeout)
2577
- return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);
2578
-
2579
- if (copy_from_user(&timeout_sys, timeout, sizeof(timeout_sys)))
2801
+ if (timeout && get_timespec64(&timeout_sys, timeout))
25802802 return -EFAULT;
25812803
2582
- datagrams = __sys_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
2804
+ if (timeout32 && get_old_timespec32(&timeout_sys, timeout32))
2805
+ return -EFAULT;
25832806
2584
- if (datagrams > 0 &&
2585
- copy_to_user(timeout, &timeout_sys, sizeof(timeout_sys)))
2807
+ if (!timeout && !timeout32)
2808
+ return do_recvmmsg(fd, mmsg, vlen, flags, NULL);
2809
+
2810
+ datagrams = do_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
2811
+
2812
+ if (datagrams <= 0)
2813
+ return datagrams;
2814
+
2815
+ if (timeout && put_timespec64(&timeout_sys, timeout))
2816
+ datagrams = -EFAULT;
2817
+
2818
+ if (timeout32 && put_old_timespec32(&timeout_sys, timeout32))
25862819 datagrams = -EFAULT;
25872820
25882821 return datagrams;
....@@ -2590,10 +2823,25 @@
25902823
25912824 SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
25922825 unsigned int, vlen, unsigned int, flags,
2593
- struct timespec __user *, timeout)
2826
+ struct __kernel_timespec __user *, timeout)
25942827 {
2595
- return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
2828
+ if (flags & MSG_CMSG_COMPAT)
2829
+ return -EINVAL;
2830
+
2831
+ return __sys_recvmmsg(fd, mmsg, vlen, flags, timeout, NULL);
25962832 }
2833
+
2834
+#ifdef CONFIG_COMPAT_32BIT_TIME
2835
+SYSCALL_DEFINE5(recvmmsg_time32, int, fd, struct mmsghdr __user *, mmsg,
2836
+ unsigned int, vlen, unsigned int, flags,
2837
+ struct old_timespec32 __user *, timeout)
2838
+{
2839
+ if (flags & MSG_CMSG_COMPAT)
2840
+ return -EINVAL;
2841
+
2842
+ return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL, timeout);
2843
+}
2844
+#endif
25972845
25982846 #ifdef __ARCH_WANT_SYS_SOCKETCALL
25992847 /* Argument list sizes for sys_socketcall */
....@@ -2713,8 +2961,15 @@
27132961 a[2], true);
27142962 break;
27152963 case SYS_RECVMMSG:
2716
- err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
2717
- a[3], (struct timespec __user *)a[4]);
2964
+ if (IS_ENABLED(CONFIG_64BIT))
2965
+ err = __sys_recvmmsg(a0, (struct mmsghdr __user *)a1,
2966
+ a[2], a[3],
2967
+ (struct __kernel_timespec __user *)a[4],
2968
+ NULL);
2969
+ else
2970
+ err = __sys_recvmmsg(a0, (struct mmsghdr __user *)a1,
2971
+ a[2], a[3], NULL,
2972
+ (struct old_timespec32 __user *)a[4]);
27182973 break;
27192974 case SYS_ACCEPT4:
27202975 err = __sys_accept4(a0, (struct sockaddr __user *)a1,
....@@ -2817,7 +3072,7 @@
28173072
28183073 err = register_filesystem(&sock_fs_type);
28193074 if (err)
2820
- goto out_fs;
3075
+ goto out;
28213076 sock_mnt = kern_mount(&sock_fs_type);
28223077 if (IS_ERR(sock_mnt)) {
28233078 err = PTR_ERR(sock_mnt);
....@@ -2840,7 +3095,6 @@
28403095
28413096 out_mount:
28423097 unregister_filesystem(&sock_fs_type);
2843
-out_fs:
28443098 goto out;
28453099 }
28463100
....@@ -2855,38 +3109,6 @@
28553109 #endif /* CONFIG_PROC_FS */
28563110
28573111 #ifdef CONFIG_COMPAT
2858
-static int do_siocgstamp(struct net *net, struct socket *sock,
2859
- unsigned int cmd, void __user *up)
2860
-{
2861
- mm_segment_t old_fs = get_fs();
2862
- struct timeval ktv;
2863
- int err;
2864
-
2865
- set_fs(KERNEL_DS);
2866
- err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv);
2867
- set_fs(old_fs);
2868
- if (!err)
2869
- err = compat_put_timeval(&ktv, up);
2870
-
2871
- return err;
2872
-}
2873
-
2874
-static int do_siocgstampns(struct net *net, struct socket *sock,
2875
- unsigned int cmd, void __user *up)
2876
-{
2877
- mm_segment_t old_fs = get_fs();
2878
- struct timespec kts;
2879
- int err;
2880
-
2881
- set_fs(KERNEL_DS);
2882
- err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts);
2883
- set_fs(old_fs);
2884
- if (!err)
2885
- err = compat_put_timespec(&kts, up);
2886
-
2887
- return err;
2888
-}
2889
-
28903112 static int compat_dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32)
28913113 {
28923114 struct compat_ifconf ifc32;
....@@ -2908,128 +3130,6 @@
29083130 ifc32.ifc_len = ifc.ifc_len;
29093131 if (copy_to_user(uifc32, &ifc32, sizeof(struct compat_ifconf)))
29103132 return -EFAULT;
2911
-
2912
- return 0;
2913
-}
2914
-
2915
-static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32)
2916
-{
2917
- struct compat_ethtool_rxnfc __user *compat_rxnfc;
2918
- bool convert_in = false, convert_out = false;
2919
- size_t buf_size = 0;
2920
- struct ethtool_rxnfc __user *rxnfc = NULL;
2921
- struct ifreq ifr;
2922
- u32 rule_cnt = 0, actual_rule_cnt;
2923
- u32 ethcmd;
2924
- u32 data;
2925
- int ret;
2926
-
2927
- if (get_user(data, &ifr32->ifr_ifru.ifru_data))
2928
- return -EFAULT;
2929
-
2930
- compat_rxnfc = compat_ptr(data);
2931
-
2932
- if (get_user(ethcmd, &compat_rxnfc->cmd))
2933
- return -EFAULT;
2934
-
2935
- /* Most ethtool structures are defined without padding.
2936
- * Unfortunately struct ethtool_rxnfc is an exception.
2937
- */
2938
- switch (ethcmd) {
2939
- default:
2940
- break;
2941
- case ETHTOOL_GRXCLSRLALL:
2942
- /* Buffer size is variable */
2943
- if (get_user(rule_cnt, &compat_rxnfc->rule_cnt))
2944
- return -EFAULT;
2945
- if (rule_cnt > KMALLOC_MAX_SIZE / sizeof(u32))
2946
- return -ENOMEM;
2947
- buf_size += rule_cnt * sizeof(u32);
2948
- /* fall through */
2949
- case ETHTOOL_GRXRINGS:
2950
- case ETHTOOL_GRXCLSRLCNT:
2951
- case ETHTOOL_GRXCLSRULE:
2952
- case ETHTOOL_SRXCLSRLINS:
2953
- convert_out = true;
2954
- /* fall through */
2955
- case ETHTOOL_SRXCLSRLDEL:
2956
- buf_size += sizeof(struct ethtool_rxnfc);
2957
- convert_in = true;
2958
- rxnfc = compat_alloc_user_space(buf_size);
2959
- break;
2960
- }
2961
-
2962
- if (copy_from_user(&ifr.ifr_name, &ifr32->ifr_name, IFNAMSIZ))
2963
- return -EFAULT;
2964
-
2965
- ifr.ifr_data = convert_in ? rxnfc : (void __user *)compat_rxnfc;
2966
-
2967
- if (convert_in) {
2968
- /* We expect there to be holes between fs.m_ext and
2969
- * fs.ring_cookie and at the end of fs, but nowhere else.
2970
- */
2971
- BUILD_BUG_ON(offsetof(struct compat_ethtool_rxnfc, fs.m_ext) +
2972
- sizeof(compat_rxnfc->fs.m_ext) !=
2973
- offsetof(struct ethtool_rxnfc, fs.m_ext) +
2974
- sizeof(rxnfc->fs.m_ext));
2975
- BUILD_BUG_ON(
2976
- offsetof(struct compat_ethtool_rxnfc, fs.location) -
2977
- offsetof(struct compat_ethtool_rxnfc, fs.ring_cookie) !=
2978
- offsetof(struct ethtool_rxnfc, fs.location) -
2979
- offsetof(struct ethtool_rxnfc, fs.ring_cookie));
2980
-
2981
- if (copy_in_user(rxnfc, compat_rxnfc,
2982
- (void __user *)(&rxnfc->fs.m_ext + 1) -
2983
- (void __user *)rxnfc) ||
2984
- copy_in_user(&rxnfc->fs.ring_cookie,
2985
- &compat_rxnfc->fs.ring_cookie,
2986
- (void __user *)(&rxnfc->fs.location + 1) -
2987
- (void __user *)&rxnfc->fs.ring_cookie))
2988
- return -EFAULT;
2989
- if (ethcmd == ETHTOOL_GRXCLSRLALL) {
2990
- if (put_user(rule_cnt, &rxnfc->rule_cnt))
2991
- return -EFAULT;
2992
- } else if (copy_in_user(&rxnfc->rule_cnt,
2993
- &compat_rxnfc->rule_cnt,
2994
- sizeof(rxnfc->rule_cnt)))
2995
- return -EFAULT;
2996
- }
2997
-
2998
- ret = dev_ioctl(net, SIOCETHTOOL, &ifr, NULL);
2999
- if (ret)
3000
- return ret;
3001
-
3002
- if (convert_out) {
3003
- if (copy_in_user(compat_rxnfc, rxnfc,
3004
- (const void __user *)(&rxnfc->fs.m_ext + 1) -
3005
- (const void __user *)rxnfc) ||
3006
- copy_in_user(&compat_rxnfc->fs.ring_cookie,
3007
- &rxnfc->fs.ring_cookie,
3008
- (const void __user *)(&rxnfc->fs.location + 1) -
3009
- (const void __user *)&rxnfc->fs.ring_cookie) ||
3010
- copy_in_user(&compat_rxnfc->rule_cnt, &rxnfc->rule_cnt,
3011
- sizeof(rxnfc->rule_cnt)))
3012
- return -EFAULT;
3013
-
3014
- if (ethcmd == ETHTOOL_GRXCLSRLALL) {
3015
- /* As an optimisation, we only copy the actual
3016
- * number of rules that the underlying
3017
- * function returned. Since Mallory might
3018
- * change the rule count in user memory, we
3019
- * check that it is less than the rule count
3020
- * originally given (as the user buffer size),
3021
- * which has been range-checked.
3022
- */
3023
- if (get_user(actual_rule_cnt, &rxnfc->rule_cnt))
3024
- return -EFAULT;
3025
- if (actual_rule_cnt < rule_cnt)
3026
- rule_cnt = actual_rule_cnt;
3027
- if (copy_in_user(&compat_rxnfc->rule_locs[0],
3028
- &rxnfc->rule_locs[0],
3029
- rule_cnt * sizeof(u32)))
3030
- return -EFAULT;
3031
- }
3032
- }
30333133
30343134 return 0;
30353135 }
....@@ -3159,94 +3259,6 @@
31593259 return err;
31603260 }
31613261
3162
-struct rtentry32 {
3163
- u32 rt_pad1;
3164
- struct sockaddr rt_dst; /* target address */
3165
- struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
3166
- struct sockaddr rt_genmask; /* target network mask (IP) */
3167
- unsigned short rt_flags;
3168
- short rt_pad2;
3169
- u32 rt_pad3;
3170
- unsigned char rt_tos;
3171
- unsigned char rt_class;
3172
- short rt_pad4;
3173
- short rt_metric; /* +1 for binary compatibility! */
3174
- /* char * */ u32 rt_dev; /* forcing the device at add */
3175
- u32 rt_mtu; /* per route MTU/Window */
3176
- u32 rt_window; /* Window clamping */
3177
- unsigned short rt_irtt; /* Initial RTT */
3178
-};
3179
-
3180
-struct in6_rtmsg32 {
3181
- struct in6_addr rtmsg_dst;
3182
- struct in6_addr rtmsg_src;
3183
- struct in6_addr rtmsg_gateway;
3184
- u32 rtmsg_type;
3185
- u16 rtmsg_dst_len;
3186
- u16 rtmsg_src_len;
3187
- u32 rtmsg_metric;
3188
- u32 rtmsg_info;
3189
- u32 rtmsg_flags;
3190
- s32 rtmsg_ifindex;
3191
-};
3192
-
3193
-static int routing_ioctl(struct net *net, struct socket *sock,
3194
- unsigned int cmd, void __user *argp)
3195
-{
3196
- int ret;
3197
- void *r = NULL;
3198
- struct in6_rtmsg r6;
3199
- struct rtentry r4;
3200
- char devname[16];
3201
- u32 rtdev;
3202
- mm_segment_t old_fs = get_fs();
3203
-
3204
- if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */
3205
- struct in6_rtmsg32 __user *ur6 = argp;
3206
- ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst),
3207
- 3 * sizeof(struct in6_addr));
3208
- ret |= get_user(r6.rtmsg_type, &(ur6->rtmsg_type));
3209
- ret |= get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len));
3210
- ret |= get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len));
3211
- ret |= get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric));
3212
- ret |= get_user(r6.rtmsg_info, &(ur6->rtmsg_info));
3213
- ret |= get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags));
3214
- ret |= get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex));
3215
-
3216
- r = (void *) &r6;
3217
- } else { /* ipv4 */
3218
- struct rtentry32 __user *ur4 = argp;
3219
- ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst),
3220
- 3 * sizeof(struct sockaddr));
3221
- ret |= get_user(r4.rt_flags, &(ur4->rt_flags));
3222
- ret |= get_user(r4.rt_metric, &(ur4->rt_metric));
3223
- ret |= get_user(r4.rt_mtu, &(ur4->rt_mtu));
3224
- ret |= get_user(r4.rt_window, &(ur4->rt_window));
3225
- ret |= get_user(r4.rt_irtt, &(ur4->rt_irtt));
3226
- ret |= get_user(rtdev, &(ur4->rt_dev));
3227
- if (rtdev) {
3228
- ret |= copy_from_user(devname, compat_ptr(rtdev), 15);
3229
- r4.rt_dev = (char __user __force *)devname;
3230
- devname[15] = 0;
3231
- } else
3232
- r4.rt_dev = NULL;
3233
-
3234
- r = (void *) &r4;
3235
- }
3236
-
3237
- if (ret) {
3238
- ret = -EFAULT;
3239
- goto out;
3240
- }
3241
-
3242
- set_fs(KERNEL_DS);
3243
- ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r);
3244
- set_fs(old_fs);
3245
-
3246
-out:
3247
- return ret;
3248
-}
3249
-
32503262 /* Since old style bridge ioctl's endup using SIOCDEVPRIVATE
32513263 * for some operations; this forces use of the newer bridge-utils that
32523264 * use compatible ioctls
....@@ -3278,20 +3290,19 @@
32783290 return old_bridge_ioctl(argp);
32793291 case SIOCGIFCONF:
32803292 return compat_dev_ifconf(net, argp);
3281
- case SIOCETHTOOL:
3282
- return ethtool_ioctl(net, argp);
32833293 case SIOCWANDEV:
32843294 return compat_siocwandev(net, argp);
32853295 case SIOCGIFMAP:
32863296 case SIOCSIFMAP:
32873297 return compat_sioc_ifmap(net, cmd, argp);
3288
- case SIOCADDRT:
3289
- case SIOCDELRT:
3290
- return routing_ioctl(net, sock, cmd, argp);
3291
- case SIOCGSTAMP:
3292
- return do_siocgstamp(net, sock, cmd, argp);
3293
- case SIOCGSTAMPNS:
3294
- return do_siocgstampns(net, sock, cmd, argp);
3298
+ case SIOCGSTAMP_OLD:
3299
+ case SIOCGSTAMPNS_OLD:
3300
+ if (!sock->ops->gettstamp)
3301
+ return -ENOIOCTLCMD;
3302
+ return sock->ops->gettstamp(sock, argp, cmd == SIOCGSTAMP_OLD,
3303
+ !COMPAT_USE_64BIT_TIME);
3304
+
3305
+ case SIOCETHTOOL:
32953306 case SIOCBONDSLAVEINFOQUERY:
32963307 case SIOCBONDINFOQUERY:
32973308 case SIOCSHWTSTAMP:
....@@ -3309,6 +3320,8 @@
33093320 case SIOCADDDLCI:
33103321 case SIOCDELDLCI:
33113322 case SIOCGSKNS:
3323
+ case SIOCGSTAMP_NEW:
3324
+ case SIOCGSTAMPNS_NEW:
33123325 return sock_ioctl(file, cmd, arg);
33133326
33143327 case SIOCGIFFLAGS:
....@@ -3354,6 +3367,7 @@
33543367 case SIOCSARP:
33553368 case SIOCGARP:
33563369 case SIOCDARP:
3370
+ case SIOCOUTQ:
33573371 case SIOCOUTQNSD:
33583372 case SIOCATMARK:
33593373 return sock_do_ioctl(net, sock, cmd, arg);
....@@ -3468,7 +3482,11 @@
34683482 int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
34693483 int flags)
34703484 {
3471
- return sock->ops->connect(sock, addr, addrlen, flags);
3485
+ struct sockaddr_storage address;
3486
+
3487
+ memcpy(&address, addr, addrlen);
3488
+
3489
+ return sock->ops->connect(sock, (struct sockaddr *)&address, addrlen, flags);
34723490 }
34733491 EXPORT_SYMBOL(kernel_connect);
34743492
....@@ -3488,7 +3506,7 @@
34883506 EXPORT_SYMBOL(kernel_getsockname);
34893507
34903508 /**
3491
- * kernel_peername - get the address which the socket is connected (kernel space)
3509
+ * kernel_getpeername - get the address which the socket is connected (kernel space)
34923510 * @sock: socket
34933511 * @addr: address holder
34943512 *
....@@ -3501,71 +3519,6 @@
35013519 return sock->ops->getname(sock, addr, 1);
35023520 }
35033521 EXPORT_SYMBOL(kernel_getpeername);
3504
-
3505
-/**
3506
- * kernel_getsockopt - get a socket option (kernel space)
3507
- * @sock: socket
3508
- * @level: API level (SOL_SOCKET, ...)
3509
- * @optname: option tag
3510
- * @optval: option value
3511
- * @optlen: option length
3512
- *
3513
- * Assigns the option length to @optlen.
3514
- * Returns 0 or an error.
3515
- */
3516
-
3517
-int kernel_getsockopt(struct socket *sock, int level, int optname,
3518
- char *optval, int *optlen)
3519
-{
3520
- mm_segment_t oldfs = get_fs();
3521
- char __user *uoptval;
3522
- int __user *uoptlen;
3523
- int err;
3524
-
3525
- uoptval = (char __user __force *) optval;
3526
- uoptlen = (int __user __force *) optlen;
3527
-
3528
- set_fs(KERNEL_DS);
3529
- if (level == SOL_SOCKET)
3530
- err = sock_getsockopt(sock, level, optname, uoptval, uoptlen);
3531
- else
3532
- err = sock->ops->getsockopt(sock, level, optname, uoptval,
3533
- uoptlen);
3534
- set_fs(oldfs);
3535
- return err;
3536
-}
3537
-EXPORT_SYMBOL(kernel_getsockopt);
3538
-
3539
-/**
3540
- * kernel_setsockopt - set a socket option (kernel space)
3541
- * @sock: socket
3542
- * @level: API level (SOL_SOCKET, ...)
3543
- * @optname: option tag
3544
- * @optval: option value
3545
- * @optlen: option length
3546
- *
3547
- * Returns 0 or an error.
3548
- */
3549
-
3550
-int kernel_setsockopt(struct socket *sock, int level, int optname,
3551
- char *optval, unsigned int optlen)
3552
-{
3553
- mm_segment_t oldfs = get_fs();
3554
- char __user *uoptval;
3555
- int err;
3556
-
3557
- uoptval = (char __user __force *) optval;
3558
-
3559
- set_fs(KERNEL_DS);
3560
- if (level == SOL_SOCKET)
3561
- err = sock_setsockopt(sock, level, optname, uoptval, optlen);
3562
- else
3563
- err = sock->ops->setsockopt(sock, level, optname, uoptval,
3564
- optlen);
3565
- set_fs(oldfs);
3566
- return err;
3567
-}
3568
-EXPORT_SYMBOL(kernel_setsockopt);
35693522
35703523 /**
35713524 * kernel_sendpage - send a &page through a socket (kernel space)
....@@ -3581,9 +3534,11 @@
35813534 int kernel_sendpage(struct socket *sock, struct page *page, int offset,
35823535 size_t size, int flags)
35833536 {
3584
- if (sock->ops->sendpage)
3537
+ if (sock->ops->sendpage) {
3538
+ /* Warn in case the improper page to zero-copy send */
3539
+ WARN_ONCE(!sendpage_ok(page), "improper page for zero-copy send");
35853540 return sock->ops->sendpage(sock, page, offset, size, flags);
3586
-
3541
+ }
35873542 return sock_no_sendpage(sock, page, offset, size, flags);
35883543 }
35893544 EXPORT_SYMBOL(kernel_sendpage);
....@@ -3614,7 +3569,7 @@
36143569 EXPORT_SYMBOL(kernel_sendpage_locked);
36153570
36163571 /**
3617
- * kernel_shutdown - shut down part of a full-duplex connection (kernel space)
3572
+ * kernel_sock_shutdown - shut down part of a full-duplex connection (kernel space)
36183573 * @sock: socket
36193574 * @how: connection part
36203575 *