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
..
Kconfig docs: networking: convert rxrpc.txt to ReST 2020-04-30 12:56:38 -07:00
Makefile rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01: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 rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01:00
call_event.c rxrpc: Fix race between incoming ACK parser and retransmitter 2020-06-11 18:18:22 -07:00
call_object.c rxrpc: Fix call interruptibility handling 2020-03-13 23:04:30 +00:00
conn_client.c rxrpc: Fix call interruptibility handling 2020-03-13 23:04:30 +00:00
conn_event.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
conn_object.c rxrpc: Fix service call disconnection 2020-02-07 11:19:38 +01:00
conn_service.c rxrpc: Fix missing security check on incoming calls 2019-12-20 16:21:32 +00:00
input.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
insecure.c rxrpc: Fix -Wframe-larger-than= warnings from on-stack crypto 2019-07-30 10:32:35 -07:00
key.c KEYS: Don't write out to userspace while holding key semaphore 2020-03-29 12:40:41 +01:00
local_event.c rxrpc: Use the tx-phase skb flag to simplify tracing 2019-08-27 10:04:18 +01:00
local_object.c ipv6: add ip6_sock_set_recverr 2020-05-28 11:11:45 -07:00
misc.c rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01:00
net_ns.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 36 2019-05-24 17:27:11 +02:00
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 rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01:00
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 rxrpc: Improve jumbo packet counting 2019-08-27 09:48:37 +01:00
recvmsg.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
rtt.c rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01:00
rxkad.c rxrpc: Fix a memory leak in rxkad_verify_response() 2020-05-23 00:35:46 +01:00
security.c rxrpc: Fix missing security check on incoming calls 2019-12-20 16:21:32 +00:00
sendmsg.c rxrpc: Fix missing notification 2020-06-05 13:36:35 +01:00
skbuff.c rxrpc: Use skb_unshare() rather than skb_cow_data() 2019-08-27 10:13:46 +01:00
sysctl.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-05-24 13:47:27 -07:00
utils.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 36 2019-05-24 17:27:11 +02:00