Commit 41c57a87 authored by David Barksdale's avatar David Barksdale Committed by Linus Torvalds

[PATCH] IPMI: fix timeout list handling

Fix a dangling pointer bug in ipmi_timeout_handler.  A list of timedout
messages is not re-initialized before reuse, causing the head of the list
to point to freed memory.
Signed-off-by: default avatarDavid Barksdale <amatus@ocgnet.org>
Signed-off-by: default avatarCorey Minyard <minyard@acm.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fa8609da
...@@ -3649,8 +3649,6 @@ static void ipmi_timeout_handler(long timeout_period) ...@@ -3649,8 +3649,6 @@ static void ipmi_timeout_handler(long timeout_period)
unsigned long flags; unsigned long flags;
int i; int i;
INIT_LIST_HEAD(&timeouts);
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
/* See if any waiting messages need to be processed. */ /* See if any waiting messages need to be processed. */
...@@ -3671,6 +3669,7 @@ static void ipmi_timeout_handler(long timeout_period) ...@@ -3671,6 +3669,7 @@ static void ipmi_timeout_handler(long timeout_period)
/* Go through the seq table and find any messages that /* Go through the seq table and find any messages that
have timed out, putting them in the timeouts have timed out, putting them in the timeouts
list. */ list. */
INIT_LIST_HEAD(&timeouts);
spin_lock_irqsave(&intf->seq_lock, flags); spin_lock_irqsave(&intf->seq_lock, flags);
for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++)
check_msg_timeout(intf, &(intf->seq_table[i]), check_msg_timeout(intf, &(intf->seq_table[i]),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment