linux/net/rxrpc
David Howells 2ad6691d98 rxrpc: Fix race between incoming ACK parser and retransmitter
There's a race between the retransmission code and the received ACK parser.
The problem is that the retransmission loop has to drop the lock under
which it is iterating through the transmission buffer in order to transmit
a packet, but whilst the lock is dropped, the ACK parser can crank the Tx
window round and discard the packets from the buffer.

The retransmission code then updated the annotations for the wrong packet
and a later retransmission thought it had to retransmit a packet that
wasn't there, leading to a NULL pointer dereference.

Fix this by:

 (1) Moving the annotation change to before we drop the lock prior to
     transmission.  This means we can't vary the annotation depending on
     the outcome of the transmission, but that's fine - we'll retransmit
     again later if it failed now.

 (2) Skipping the packet if the skb pointer is NULL.

The following oops was seen:

	BUG: kernel NULL pointer dereference, address: 000000000000002d
	Workqueue: krxrpcd rxrpc_process_call
	RIP: 0010:rxrpc_get_skb+0x14/0x8a
	...
	Call Trace:
	 rxrpc_resend+0x331/0x41e
	 ? get_vtime_delta+0x13/0x20
	 rxrpc_process_call+0x3c0/0x4ac
	 process_one_work+0x18f/0x27f
	 worker_thread+0x1a3/0x247
	 ? create_worker+0x17d/0x17d
	 kthread+0xe6/0xeb
	 ? kthread_delayed_work_timer_fn+0x83/0x83
	 ret_from_fork+0x1f/0x30

Fixes: 248f219cb8 ("rxrpc: Rewrite the data and ack handling code")
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-06-11 18:18:22 -07:00
..
af_rxrpc.c rxrpc: add rxrpc_sock_set_min_security_level 2020-05-28 11:11:46 -07:00
ar-internal.h rxrpc: Move the call completion handling out of line 2020-06-05 13:36:35 +01:00
call_accept.c
call_event.c rxrpc: Fix race between incoming ACK parser and retransmitter 2020-06-11 18:18:22 -07:00
call_object.c
conn_client.c
conn_event.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
conn_object.c
conn_service.c
input.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
insecure.c
Kconfig
key.c
local_event.c
local_object.c ipv6: add ip6_sock_set_recverr 2020-05-28 11:11:45 -07:00
Makefile
misc.c
net_ns.c
output.c ipv4: add ip_sock_set_mtu_discover 2020-05-28 11:11:45 -07:00
peer_event.c rxrpc fixes 2020-06-08 19:13:37 -07:00
peer_object.c
proc.c rxrpc: Adjust /proc/net/rxrpc/calls to display call->debug_id not user_ID 2020-05-31 15:19:51 +01:00
protocol.h
recvmsg.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
rtt.c
rxkad.c
security.c
sendmsg.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
skbuff.c
sysctl.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-05-24 13:47:27 -07:00
utils.c