• David Howells's avatar
    rxrpc: Fix an insufficiently large sglist in rxkad_verify_packet_2() · 0d40f728
    David Howells authored
    rxkad_verify_packet_2() has a small stack-allocated sglist of 4 elements,
    but if that isn't sufficient for the number of fragments in the socket
    buffer, we try to allocate an sglist large enough to hold all the
    fragments.
    
    However, for large packets with a lot of fragments, this isn't sufficient
    and we need at least one additional fragment.
    
    The problem manifests as skb_to_sgvec() returning -EMSGSIZE and this then
    getting returned by userspace.  Most of the time, this isn't a problem as
    rxrpc sets a limit of 5692, big enough for 4 jumbo subpackets to be glued
    together; occasionally, however, the server will ignore the reported limit
    and give a packet that's a lot bigger - say 19852 bytes with ->nr_frags
    being 7.  skb_to_sgvec() then tries to return a "zeroth" fragment that
    seems to occur before the fragments counted by ->nr_frags and we hit the
    end of the sglist too early.
    
    Note that __skb_to_sgvec() also has an skb_walk_frags() loop that is
    recursive up to 24 deep.  I'm not sure if I need to take account of that
    too - or if there's an easy way of counting those frags too.
    
    Fix this by counting an extra frag and allocating a larger sglist based on
    that.
    
    Fixes: d0d5c0cd ("rxrpc: Use skb_unshare() rather than skb_cow_data()")
    Reported-by: default avatarMarc Dionne <marc.dionne@auristor.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: linux-afs@lists.infradead.org
    0d40f728
rxkad.c 34.9 KB