| .. | .. |
|---|
| 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 | |
|---|