• Jakub Kicinski's avatar
    tls: rx: allow only one reader at a time · 4cbc325e
    Jakub Kicinski authored
    recvmsg() in TLS gets data from the skb list (rx_list) or fresh
    skbs we read from TCP via strparser. The former holds skbs which were
    already decrypted for peek or decrypted and partially consumed.
    
    tls_wait_data() only notices appearance of fresh skbs coming out
    of TCP (or psock). It is possible, if there is a concurrent call
    to peek() and recv() that the peek() will move the data from input
    to rx_list without recv() noticing. recv() will then read data out
    of order or never wake up.
    
    This is not a practical use case/concern, but it makes the self
    tests less reliable. This patch solves the problem by allowing
    only one reader in.
    
    Because having multiple processes calling read()/peek() is not
    normal avoid adding a lock and try to fast-path the single reader
    case.
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4cbc325e
tls_sw.c 65.9 KB