diff options
Diffstat (limited to 'net/tipc/socket.c')
| -rw-r--r-- | net/tipc/socket.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 29d94d53198d..338837396642 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -535,6 +535,9 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
| 535 | if (unlikely((m->msg_namelen < sizeof(*dest)) || | 535 | if (unlikely((m->msg_namelen < sizeof(*dest)) || |
| 536 | (dest->family != AF_TIPC))) | 536 | (dest->family != AF_TIPC))) |
| 537 | return -EINVAL; | 537 | return -EINVAL; |
| 538 | if ((total_len > TIPC_MAX_USER_MSG_SIZE) || | ||
| 539 | (m->msg_iovlen > (unsigned)INT_MAX)) | ||
| 540 | return -EMSGSIZE; | ||
| 538 | 541 | ||
| 539 | if (iocb) | 542 | if (iocb) |
| 540 | lock_sock(sk); | 543 | lock_sock(sk); |
| @@ -573,12 +576,14 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
| 573 | &dest->addr.name.name, | 576 | &dest->addr.name.name, |
| 574 | dest->addr.name.domain, | 577 | dest->addr.name.domain, |
| 575 | m->msg_iovlen, | 578 | m->msg_iovlen, |
| 576 | m->msg_iov); | 579 | m->msg_iov, |
| 580 | total_len); | ||
| 577 | } else if (dest->addrtype == TIPC_ADDR_ID) { | 581 | } else if (dest->addrtype == TIPC_ADDR_ID) { |
| 578 | res = tipc_send2port(tport->ref, | 582 | res = tipc_send2port(tport->ref, |
| 579 | &dest->addr.id, | 583 | &dest->addr.id, |
| 580 | m->msg_iovlen, | 584 | m->msg_iovlen, |
| 581 | m->msg_iov); | 585 | m->msg_iov, |
| 586 | total_len); | ||
| 582 | } else if (dest->addrtype == TIPC_ADDR_MCAST) { | 587 | } else if (dest->addrtype == TIPC_ADDR_MCAST) { |
| 583 | if (needs_conn) { | 588 | if (needs_conn) { |
| 584 | res = -EOPNOTSUPP; | 589 | res = -EOPNOTSUPP; |
| @@ -590,7 +595,8 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
| 590 | res = tipc_multicast(tport->ref, | 595 | res = tipc_multicast(tport->ref, |
| 591 | &dest->addr.nameseq, | 596 | &dest->addr.nameseq, |
| 592 | m->msg_iovlen, | 597 | m->msg_iovlen, |
| 593 | m->msg_iov); | 598 | m->msg_iov, |
| 599 | total_len); | ||
| 594 | } | 600 | } |
| 595 | if (likely(res != -ELINKCONG)) { | 601 | if (likely(res != -ELINKCONG)) { |
| 596 | if (needs_conn && (res >= 0)) | 602 | if (needs_conn && (res >= 0)) |
| @@ -640,6 +646,10 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
| 640 | if (unlikely(dest)) | 646 | if (unlikely(dest)) |
| 641 | return send_msg(iocb, sock, m, total_len); | 647 | return send_msg(iocb, sock, m, total_len); |
| 642 | 648 | ||
| 649 | if ((total_len > TIPC_MAX_USER_MSG_SIZE) || | ||
| 650 | (m->msg_iovlen > (unsigned)INT_MAX)) | ||
| 651 | return -EMSGSIZE; | ||
| 652 | |||
| 643 | if (iocb) | 653 | if (iocb) |
| 644 | lock_sock(sk); | 654 | lock_sock(sk); |
| 645 | 655 | ||
| @@ -652,7 +662,8 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
| 652 | break; | 662 | break; |
| 653 | } | 663 | } |
| 654 | 664 | ||
| 655 | res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov); | 665 | res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov, |
| 666 | total_len); | ||
| 656 | if (likely(res != -ELINKCONG)) | 667 | if (likely(res != -ELINKCONG)) |
| 657 | break; | 668 | break; |
| 658 | if (m->msg_flags & MSG_DONTWAIT) { | 669 | if (m->msg_flags & MSG_DONTWAIT) { |
| @@ -723,6 +734,12 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, | |||
| 723 | goto exit; | 734 | goto exit; |
| 724 | } | 735 | } |
| 725 | 736 | ||
| 737 | if ((total_len > (unsigned)INT_MAX) || | ||
| 738 | (m->msg_iovlen > (unsigned)INT_MAX)) { | ||
| 739 | res = -EMSGSIZE; | ||
| 740 | goto exit; | ||
| 741 | } | ||
| 742 | |||
| 726 | /* | 743 | /* |
| 727 | * Send each iovec entry using one or more messages | 744 | * Send each iovec entry using one or more messages |
| 728 | * | 745 | * |
| @@ -753,7 +770,7 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, | |||
| 753 | bytes_to_send = curr_left; | 770 | bytes_to_send = curr_left; |
| 754 | my_iov.iov_base = curr_start; | 771 | my_iov.iov_base = curr_start; |
| 755 | my_iov.iov_len = bytes_to_send; | 772 | my_iov.iov_len = bytes_to_send; |
| 756 | res = send_packet(NULL, sock, &my_msg, 0); | 773 | res = send_packet(NULL, sock, &my_msg, bytes_to_send); |
| 757 | if (res < 0) { | 774 | if (res < 0) { |
| 758 | if (bytes_sent) | 775 | if (bytes_sent) |
| 759 | res = bytes_sent; | 776 | res = bytes_sent; |
