Patch "inet: fix race in reqsk_queue_unlink()" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
inet: fix race in reqsk_queue_unlink()
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
inet-fix-race-in-reqsk_queue_unlink.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Oct 22 17:25:37 PDT 2015
From: Eric Dumazet <[email protected]>
Date: Thu, 1 Oct 2015 05:39:26 -0700
Subject: inet: fix race in reqsk_queue_unlink()
From: Eric Dumazet <[email protected]>
[ Upstream commit 2306c704ce280c97a60d1f45333b822b40281dea ]
reqsk_timer_handler() tests if icsk_accept_queue.listen_opt is NULL at its beginning.
By the time it calls inet_csk_reqsk_queue_drop() and reqsk_queue_unlink(), listener might have been closed and inet_csk_listen_stop() had called reqsk_queue_yank_acceptq() which sets icsk_accept_queue.listen_opt to NULL
We therefore need to correctly check listen_opt being NULL after holding syn_wait_lock for proper synchronization.
--- net/ipv4/inet_connection_sock.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
net/ipv4/inet_connection_sock.c +10 -9
@@ -568,21 +568,22 @@ EXPORT_SYMBOL(inet_rtx_syn_ack);static bool reqsk_queue_unlink (struct request_sock_queue *queue,struct request_sock *req) { -struct listen_sock *lopt = queue->listen_opt;struct request_sock **prev; +struct listen_sock *lopt;bool found = false;spin_lock (&queue->syn_wait_lock); - -for (prev = &lopt->syn_table[req->rsk_hash]; *prev !=NULL ; - prev = &(*prev)->dl_next) { -if (*prev == req) { - *prev = req->dl_next; - found = true; -break ; + lopt = queue->listen_opt; +if (lopt) { +for (prev = &lopt->syn_table[req->rsk_hash]; *prev !=NULL ; + prev = &(*prev)->dl_next) { +if (*prev == req) { + *prev = req->dl_next; + found = true; +break ; + } } } -spin_unlock (&queue->syn_wait_lock);if (timer_pending (&req->rsk_timer) &&del_timer_sync (&req->rsk_timer))reqsk_put (req);
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/inet-fix-races-in-reqsk_queue_hash_req.patch queue-4.1/net-add-pfmemalloc-check-in-sk_add_backlog.patch queue-4.1/inet-fix-race-in-reqsk_queue_unlink.patch queue-4.1/net-unix-fix-logic-about-sk_peek_offset.patch queue-4.1/act_mirred-clear-sender-cpu-before-sending-to-tx.patch