lkml.org 
[lkml]   [2020]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 003/118] mptcp: sendmsg: reset iter on error
    Date
    From: Florian Westphal <fw@strlen.de>

    commit 35759383133f64d90eba120a0d3efe8f71241650 upstream.

    Once we've copied data from the iterator we need to revert in case we
    end up not sending any data.

    This bug doesn't trigger with normal 'poll' based tests, because
    we only feed a small chunk of data to kernel after poll indicated
    POLLOUT. With blocking IO and large writes this triggers. Receiver
    ends up with less data than it should get.

    Fixes: 72511aab95c94d ("mptcp: avoid blocking in tcp_sendpages")
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/mptcp/protocol.c | 8 ++++++--
    1 file changed, 6 insertions(+), 2 deletions(-)

    --- a/net/mptcp/protocol.c
    +++ b/net/mptcp/protocol.c
    @@ -605,8 +605,10 @@ static int mptcp_sendmsg_frag(struct soc
    if (!psize)
    return -EINVAL;

    - if (!sk_wmem_schedule(sk, psize + dfrag->overhead))
    + if (!sk_wmem_schedule(sk, psize + dfrag->overhead)) {
    + iov_iter_revert(&msg->msg_iter, psize);
    return -ENOMEM;
    + }
    } else {
    offset = dfrag->offset;
    psize = min_t(size_t, dfrag->data_len, avail_size);
    @@ -617,8 +619,10 @@ static int mptcp_sendmsg_frag(struct soc
    */
    ret = do_tcp_sendpages(ssk, page, offset, psize,
    msg->msg_flags | MSG_SENDPAGE_NOTLAST | MSG_DONTWAIT);
    - if (ret <= 0)
    + if (ret <= 0) {
    + iov_iter_revert(&msg->msg_iter, psize);
    return ret;
    + }

    frag_truesize += ret;
    if (!retransmission) {

    \
     
     \ /
      Last update: 2020-09-21 18:44    [W:4.098 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site