[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <BANLkTikeWzuE-384uT6RhZR6Wn=DBK+CNQ@mail.gmail.com>
Date: Wed, 18 May 2011 09:01:00 +0200
From: Jacek Luczak <difrost.kernel@...il.com>
To: netdev@...r.kernel.org
Subject: [PATCH] SCTP: fix race between sctp_bind_addr_free() and sctp_bind_addr_conflict()
During the sctp_close() call, we do not use rcu primitives to
destroy the address list attached to the endpoint. At the same
time, we do the removal of addresses from this list before
attempting to remove the socket from the port hash
As a result, it is possible for another process to find the socket
in the port hash that is in the process of being closed. It then
proceeds to traverse the address list to find the conflict, only
to have that address list suddenly disappear without rcu() critical
section.
This can result in a kernel crash with general protection fault or
kernel NULL pointer dereference.
Fix issue by closing address list removal inside RCU critical
section.
Signed-off-by: Jacek Luczak <luczak.jacek@...il.com>
Acked-by: Vlad Yasevich <vladislav.yasevich@...com>
---
bind_addr.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c
index faf71d1..19d1329 100644
--- a/net/sctp/bind_addr.c
+++ b/net/sctp/bind_addr.c
@@ -155,8 +155,16 @@ static void sctp_bind_addr_clean(struct sctp_bind_addr *bp)
/* Dispose of an SCTP_bind_addr structure */
void sctp_bind_addr_free(struct sctp_bind_addr *bp)
{
- /* Empty the bind address list. */
- sctp_bind_addr_clean(bp);
+ struct sctp_sockaddr_entry *addr;
+
+ /* Empty the bind address list inside RCU section. */
+ rcu_read_lock();
+ list_for_each_entry_rcu(addr, &bp->address_list, list) {
+ list_del_rcu(&addr->list);
+ call_rcu(&addr->rcu, sctp_local_addr_free);
+ SCTP_DBG_OBJCNT_DEC(addr);
+ }
+ rcu_read_unlock();
if (bp->malloced) {
kfree(bp);
Download attachment "sctp_fix_close_vs_conflict_race_in_bind_addr.patch" of type "application/octet-stream" (732 bytes)
Powered by blists - more mailing lists