linux-uconsole/net/rxrpc
David Howells fbbd5d05ea rxrpc: Fix an insufficiently large sglist in rxkad_verify_packet_2()
[ Upstream commit 0d40f728e2 ]

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: d0d5c0cd1e ("rxrpc: Use skb_unshare() rather than skb_cow_data()")
Reported-by: Marc Dionne <marc.dionne@auristor.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-09-15 11:32:05 +02:00
..
af_rxrpc.c rxrpc: Fix deadlock around release of dst cached on udp tunnel 2021-02-10 09:29:13 +01:00
ar-internal.h rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:21:12 +02:00
call_accept.c rxrpc: Fix memory leak in rxrpc_lookup_local 2021-02-03 23:28:50 +01:00
call_event.c rxrpc: Don't try to resend the request if we're receiving the reply 2022-06-09 10:21:12 +02:00
call_object.c rxrpc: Fix locking in rxrpc's sendmsg 2022-08-31 17:15:21 +02:00
conn_client.c rxrpc: Fix rxrpc_peer leak in rxrpc_look_up_bundle() 2021-12-08 09:03:25 +01:00
conn_event.c rxrpc: Fix loss of final ack on shutdown 2020-10-15 13:28:00 +01:00
conn_object.c rxrpc, afs: Fix selection of abort codes 2022-06-09 10:20:56 +02:00
conn_service.c rxrpc: Rewrite the client connection manager 2020-09-08 21:11:43 +01:00
input.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:21:12 +02:00
insecure.c
Kconfig
key.c rxrpc: Fix handling of an unsupported token type in rxrpc_read() 2021-01-23 16:04:03 +01:00
local_event.c
local_object.c rxrpc: Rewrite the client connection manager 2020-09-08 21:11:43 +01:00
Makefile
misc.c
net_ns.c rxrpc: Restore removed timer deletion 2022-04-27 13:53:49 +02:00
output.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:21:12 +02:00
peer_event.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
peer_object.c rxrpc: Fix rxrpc_local leak in rxrpc_lookup_peer() 2021-12-08 09:03:25 +01:00
proc.c rxrpc: Rewrite the client connection manager 2020-09-08 21:11:43 +01:00
protocol.h
recvmsg.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:21:12 +02:00
rtt.c rxrpc: Fix _usecs_to_jiffies() by using usecs_to_jiffies() 2021-11-18 14:04:03 +01:00
rxkad.c rxrpc: Fix an insufficiently large sglist in rxkad_verify_packet_2() 2022-09-15 11:32:05 +02:00
security.c
sendmsg.c rxrpc: Fix locking in rxrpc's sendmsg 2022-08-31 17:15:21 +02:00
skbuff.c
sysctl.c rxrpc: Fix listen() setting the bar too high for the prealloc rings 2022-06-09 10:21:12 +02:00
utils.c