.. | .. |
---|
656 | 656 | return ret; |
---|
657 | 657 | } |
---|
658 | 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 | + |
---|
659 | 667 | /** |
---|
660 | 668 | * sock_sendmsg - send a message through @sock |
---|
661 | 669 | * @sock: socket |
---|
.. | .. |
---|
666 | 674 | */ |
---|
667 | 675 | int sock_sendmsg(struct socket *sock, struct msghdr *msg) |
---|
668 | 676 | { |
---|
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; |
---|
671 | 680 | |
---|
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; |
---|
673 | 690 | } |
---|
674 | 691 | EXPORT_SYMBOL(sock_sendmsg); |
---|
675 | 692 | |
---|
.. | .. |
---|
996 | 1013 | if (sock->type == SOCK_SEQPACKET) |
---|
997 | 1014 | msg.msg_flags |= MSG_EOR; |
---|
998 | 1015 | |
---|
999 | | - res = sock_sendmsg(sock, &msg); |
---|
| 1016 | + res = __sock_sendmsg(sock, &msg); |
---|
1000 | 1017 | *from = msg.msg_iter; |
---|
1001 | 1018 | return res; |
---|
1002 | 1019 | } |
---|
.. | .. |
---|
1984 | 2001 | if (sock->file->f_flags & O_NONBLOCK) |
---|
1985 | 2002 | flags |= MSG_DONTWAIT; |
---|
1986 | 2003 | msg.msg_flags = flags; |
---|
1987 | | - err = sock_sendmsg(sock, &msg); |
---|
| 2004 | + err = __sock_sendmsg(sock, &msg); |
---|
1988 | 2005 | |
---|
1989 | 2006 | out_put: |
---|
1990 | 2007 | fput_light(sock->file, fput_needed); |
---|
.. | .. |
---|
2354 | 2371 | err = sock_sendmsg_nosec(sock, msg_sys); |
---|
2355 | 2372 | goto out_freectl; |
---|
2356 | 2373 | } |
---|
2357 | | - err = sock_sendmsg(sock, msg_sys); |
---|
| 2374 | + err = __sock_sendmsg(sock, msg_sys); |
---|
2358 | 2375 | /* |
---|
2359 | 2376 | * If this is sendmmsg() and sending to current destination address was |
---|
2360 | 2377 | * successful, remember it. |
---|
.. | .. |
---|
2765 | 2782 | * error to return on the next call or if the |
---|
2766 | 2783 | * app asks about it using getsockopt(SO_ERROR). |
---|
2767 | 2784 | */ |
---|
2768 | | - sock->sk->sk_err = -err; |
---|
| 2785 | + WRITE_ONCE(sock->sk->sk_err, -err); |
---|
2769 | 2786 | } |
---|
2770 | 2787 | out_put: |
---|
2771 | 2788 | fput_light(sock->file, fput_needed); |
---|
.. | .. |
---|
3465 | 3482 | int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, |
---|
3466 | 3483 | int flags) |
---|
3467 | 3484 | { |
---|
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); |
---|
3469 | 3490 | } |
---|
3470 | 3491 | EXPORT_SYMBOL(kernel_connect); |
---|
3471 | 3492 | |
---|