Add patch to fix soft lockups in network stack (rhbz 1266691)

This commit is contained in:
Josh Boyer 2015-10-05 08:19:05 -04:00
parent 9bcce03e3b
commit a2857988cd
4 changed files with 113 additions and 2 deletions

View File

@ -0,0 +1,40 @@
From 05676fe53c9f26fe703c57b14bdd0807e23cc33b Mon Sep 17 00:00:00 2001
From: Eric Dumazet <edumazet@google.com>
Date: Thu, 13 Aug 2015 15:44:51 -0700
Subject: [PATCH 1/2] inet: fix potential deadlock in reqsk_queue_unlink()
When replacing del_timer() with del_timer_sync(), I introduced
a deadlock condition :
reqsk_queue_unlink() is called from inet_csk_reqsk_queue_drop()
inet_csk_reqsk_queue_drop() can be called from many contexts,
one being the timer handler itself (reqsk_timer_handler()).
In this case, del_timer_sync() loops forever.
Simple fix is to test if timer is pending.
Fixes: 2235f2ac75fd ("inet: fix races with reqsk timers")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv4/inet_connection_sock.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index b27fc401c6a9..e664706b350c 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -584,7 +584,7 @@ static bool reqsk_queue_unlink(struct request_sock_queue *queue,
}
spin_unlock(&queue->syn_wait_lock);
- if (del_timer_sync(&req->rsk_timer))
+ if (timer_pending(&req->rsk_timer) && del_timer_sync(&req->rsk_timer))
reqsk_put(req);
return found;
}
--
2.4.3

View File

@ -0,0 +1,63 @@
From 8f6a05588928ef61e751ca3cb008b9847fb6b83d Mon Sep 17 00:00:00 2001
From: Eric Dumazet <edumazet@google.com>
Date: Thu, 1 Oct 2015 05:39:26 -0700
Subject: [PATCH] inet: fix race in reqsk_queue_unlink()
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.
Fixes: fa76ce7328b2 ("inet: get rid of central tcp/dccp listener timer")
Fixes: b357a364c57c ("inet: fix possible panic in reqsk_queue_unlink()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
---
net/ipv4/inet_connection_sock.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index e664706b350c..37c8b45af44b 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -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);
--
2.4.3

View File

@ -660,6 +660,10 @@ Patch529: vfs-Test-for-and-handle-paths-that-are-unreachable-f.patch
#CVE-2015-7613 rhbz 1268270 1268273
Patch532: Initialize-msg-shm-IPC-objects-before-doing-ipc_addi.patch
#rhbz 1266691
Patch534: inet-fix-potential-deadlock-in-reqsk_queue_unlink.patch
Patch535: inet-fix-race-in-reqsk_queue_unlink.patch
# END OF PATCH DEFINITIONS
%endif
@ -1438,6 +1442,10 @@ ApplyPatch vfs-Test-for-and-handle-paths-that-are-unreachable-f.patch
#CVE-2015-7613 rhbz 1268270 1268273
ApplyPatch Initialize-msg-shm-IPC-objects-before-doing-ipc_addi.patch
#rhbz 1266691
ApplyPatch inet-fix-potential-deadlock-in-reqsk_queue_unlink.patch
ApplyPatch inet-fix-race-in-reqsk_queue_unlink.patch
# END OF PATCH APPLICATIONS
%endif
@ -2288,8 +2296,9 @@ fi
#
#
%changelog
* Mon Oct 05 2015 Josh Boyer <jwboyer@fedoraproject.org>
* Mon Oct 05 2015 Josh Boyer <jwboyer@fedoraproject.org> - 4.1.10-200
- Linxu v4.1.10
- Add patch to fix soft lockups in network stack (rhbz 1266691)
* Fri Oct 02 2015 Josh Boyer <jwboyer@fedoraproject.org>
- CVE-2015-7613 Unauthorized access to IPC via SysV shm (rhbz 1268270 1268273)

View File

@ -1,4 +1,3 @@
fe9dc0f6729f36400ea81aa41d614c37 linux-4.1.tar.xz
5b4d0e18c713a479a7b4c1aa53a7432b perf-man-4.1.tar.gz
8e94d47fb46f0fc5962c65dd1ed0e79c patch-4.1.9.xz
599cb082ef44d8fb76ad8fd49d1b50fc patch-4.1.10.xz