linux-stable/net/rxrpc
David Howells e28eb3519d 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:30:05 +02:00
..
af_rxrpc.c rxrpc: Fix fall-through warnings for Clang 2021-06-04 17:40:04 -05:00
ar-internal.h rxrpc: Fix ICMP/ICMP6 error handling 2022-09-15 11:30:05 +02:00
call_accept.c rxrpc: Fix locking issue 2022-07-12 16:35:08 +02:00
call_event.c rxrpc: Don't try to resend the request if we're receiving the reply 2022-06-09 10:23:02 +02:00
call_object.c rxrpc: Fix locking in rxrpc's sendmsg 2022-08-31 17:16:45 +02:00
conn_client.c rxrpc: Fix rxrpc_peer leak in rxrpc_look_up_bundle() 2021-12-08 09:04:48 +01:00
conn_event.c rxrpc: Merge prime_packet_security into init_connection_security 2020-11-23 18:09:30 +00:00
conn_object.c rxrpc, afs: Fix selection of abort codes 2022-06-09 10:22:40 +02:00
conn_service.c rxrpc: Don't retain the server key in the connection 2020-11-23 18:09:29 +00:00
input.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:23:02 +02:00
insecure.c rxrpc: Ask the security class how much space to allow in a packet 2020-11-23 19:53:11 +00:00
Kconfig net: RxRPC: make dependent Kconfig symbols be shown indented 2021-08-18 10:12:11 +01:00
key.c rxrpc: Fix handling of an unsupported token type in rxrpc_read() 2021-01-13 10:38:00 -08:00
local_event.c rxrpc: Fix a typo 2021-06-02 14:01:55 -07:00
local_object.c rxrpc: Fix ICMP/ICMP6 error handling 2022-09-15 11:30:05 +02:00
Makefile rxrpc: Split the server key type (rxrpc_s) into its own file 2020-11-23 18:09:29 +00:00
misc.c rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01:00
net_ns.c rxrpc: Fix locking issue 2022-07-12 16:35:08 +02:00
output.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:23:02 +02:00
peer_event.c rxrpc: Fix ICMP/ICMP6 error handling 2022-09-15 11:30:05 +02:00
peer_object.c rxrpc: Fix rxrpc_local leak in rxrpc_lookup_peer() 2021-12-08 09:04:49 +01:00
proc.c rxrpc: Fix locking issue 2022-07-12 16:35:08 +02:00
protocol.h
recvmsg.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-06-09 10:23:02 +02:00
rtt.c rxrpc: Fix _usecs_to_jiffies() by using usecs_to_jiffies() 2021-11-18 19:16:25 +01:00
rxkad.c rxrpc: Fix an insufficiently large sglist in rxkad_verify_packet_2() 2022-09-15 11:30:05 +02:00
security.c rxrpc: Hand server key parsing off to the security class 2020-11-23 18:09:29 +00:00
sendmsg.c rxrpc: Fix locking in rxrpc's sendmsg 2022-08-31 17:16:45 +02:00
server_key.c rxrpc: fix some null-ptr-deref bugs in server_key.c 2022-04-08 14:24:10 +02:00
skbuff.c
sysctl.c rxrpc: Fix listen() setting the bar too high for the prealloc rings 2022-06-09 10:23:02 +02:00
utils.c