hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/socket.c
....@@ -656,6 +656,14 @@
656656 return ret;
657657 }
658658
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
+
659667 /**
660668 * sock_sendmsg - send a message through @sock
661669 * @sock: socket
....@@ -666,10 +674,19 @@
666674 */
667675 int sock_sendmsg(struct socket *sock, struct msghdr *msg)
668676 {
669
- int err = security_socket_sendmsg(sock, msg,
670
- msg_data_left(msg));
677
+ struct sockaddr_storage *save_addr = (struct sockaddr_storage *)msg->msg_name;
678
+ struct sockaddr_storage address;
679
+ int ret;
671680
672
- 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;
673690 }
674691 EXPORT_SYMBOL(sock_sendmsg);
675692
....@@ -996,7 +1013,7 @@
9961013 if (sock->type == SOCK_SEQPACKET)
9971014 msg.msg_flags |= MSG_EOR;
9981015
999
- res = sock_sendmsg(sock, &msg);
1016
+ res = __sock_sendmsg(sock, &msg);
10001017 *from = msg.msg_iter;
10011018 return res;
10021019 }
....@@ -1984,7 +2001,7 @@
19842001 if (sock->file->f_flags & O_NONBLOCK)
19852002 flags |= MSG_DONTWAIT;
19862003 msg.msg_flags = flags;
1987
- err = sock_sendmsg(sock, &msg);
2004
+ err = __sock_sendmsg(sock, &msg);
19882005
19892006 out_put:
19902007 fput_light(sock->file, fput_needed);
....@@ -2354,7 +2371,7 @@
23542371 err = sock_sendmsg_nosec(sock, msg_sys);
23552372 goto out_freectl;
23562373 }
2357
- err = sock_sendmsg(sock, msg_sys);
2374
+ err = __sock_sendmsg(sock, msg_sys);
23582375 /*
23592376 * If this is sendmmsg() and sending to current destination address was
23602377 * successful, remember it.
....@@ -2765,7 +2782,7 @@
27652782 * error to return on the next call or if the
27662783 * app asks about it using getsockopt(SO_ERROR).
27672784 */
2768
- sock->sk->sk_err = -err;
2785
+ WRITE_ONCE(sock->sk->sk_err, -err);
27692786 }
27702787 out_put:
27712788 fput_light(sock->file, fput_needed);
....@@ -3465,7 +3482,11 @@
34653482 int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
34663483 int flags)
34673484 {
3468
- 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);
34693490 }
34703491 EXPORT_SYMBOL(kernel_connect);
34713492