• Vadim Fedorenko's avatar
    net/tls: missing received data after fast remote close · 20ffc7ad
    Vadim Fedorenko authored
    In case when tcp socket received FIN after some data and the
    parser haven't started before reading data caller will receive
    an empty buffer. This behavior differs from plain TCP socket and
    leads to special treating in user-space.
    The flow that triggers the race is simple. Server sends small
    amount of data right after the connection is configured to use TLS
    and closes the connection. In this case receiver sees TLS Handshake
    data, configures TLS socket right after Change Cipher Spec record.
    While the configuration is in process, TCP socket receives small
    Application Data record, Encrypted Alert record and FIN packet. So
    the TCP socket changes sk_shutdown to RCV_SHUTDOWN and sk_flag with
    SK_DONE bit set. The received data is not parsed upon arrival and is
    never sent to user-space.
    
    Patch unpauses parser directly if we have unparsed data in tcp
    receive queue.
    
    Fixes: fcf4793e ("tls: check RCV_SHUTDOWN in tls_wait_data")
    Signed-off-by: default avatarVadim Fedorenko <vfedorenko@novek.ru>
    Link: https://lore.kernel.org/r/1605801588-12236-1-git-send-email-vfedorenko@novek.ruSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    20ffc7ad
tls_sw.c 62.8 KB