• John Fastabend's avatar
    net: tls, correctly account for copied bytes with multiple sk_msgs · 20d3d270
    John Fastabend authored
    [ Upstream commit 648ee6ce ]
    
    tls_sw_do_sendpage needs to return the total number of bytes sent
    regardless of how many sk_msgs are allocated. Unfortunately, copied
    (the value we return up the stack) is zero'd before each new sk_msg
    is allocated so we only return the copied size of the last sk_msg used.
    
    The caller (splice, etc.) of sendpage will then believe only part
    of its data was sent and send the missing chunks again. However,
    because the data actually was sent the receiver will get multiple
    copies of the same data.
    
    To reproduce this do multiple sendfile calls with a length close to
    the max record size. This will in turn call splice/sendpage, sendpage
    may use multiple sk_msg in this case and then returns the incorrect
    number of bytes. This will cause splice to resend creating duplicate
    data on the receiver. Andre created a C program that can easily
    generate this case so we will push a similar selftest for this to
    bpf-next shortly.
    
    The fix is to _not_ zero the copied field so that the total sent
    bytes is returned.
    Reported-by: default avatarSteinar H. Gunderson <steinar+kernel@gunderson.no>
    Reported-by: default avatarAndre Tomt <andre@tomt.net>
    Tested-by: default avatarAndre Tomt <andre@tomt.net>
    Fixes: d829e9c4 ("tls: convert to generic sk_msg interface")
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    20d3d270
tls_sw.c 58 KB