From a1684a2e0be4b25903d1915611a7b3f8960b8d0f Mon Sep 17 00:00:00 2001 From: Carol Hebert Date: Fri, 9 Jan 2009 21:55:47 +0000 Subject: [PATCH] Roger Mach's 12/11/08 patch to fix lan and lanplus request list entry removal bugs --- ipmitool/src/plugins/lan/lan.c | 7 +++++-- ipmitool/src/plugins/lanplus/lanplus.c | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ipmitool/src/plugins/lan/lan.c b/ipmitool/src/plugins/lan/lan.c index c5038f7..b6ae1d0 100644 --- a/ipmitool/src/plugins/lan/lan.c +++ b/ipmitool/src/plugins/lan/lan.c @@ -146,7 +146,7 @@ ipmi_req_lookup_entry(uint8_t seq, uint8_t cmd) static void ipmi_req_remove_entry(uint8_t seq, uint8_t cmd) { - struct ipmi_rq_entry * p, * e; + struct ipmi_rq_entry * p, * e, * saved_next_entry; e = p = ipmi_req_entries; @@ -157,13 +157,16 @@ ipmi_req_remove_entry(uint8_t seq, uint8_t cmd) if (e) { lprintf(LOG_DEBUG+3, "removed list entry seq=0x%02x cmd=0x%02x", seq, cmd); + saved_next_entry = e->next; p->next = (p->next == e->next) ? NULL : e->next; + /* If entry being removed is first in list, fix up list head */ if (ipmi_req_entries == e) { if (ipmi_req_entries != p) ipmi_req_entries = p; else - ipmi_req_entries = NULL; + ipmi_req_entries = saved_next_entry; } + /* If entry being removed is last in list, fix up list tail */ if (ipmi_req_entries_tail == e) { if (ipmi_req_entries_tail != p) ipmi_req_entries_tail = p; diff --git a/ipmitool/src/plugins/lanplus/lanplus.c b/ipmitool/src/plugins/lanplus/lanplus.c index 340d658..47e4470 100644 --- a/ipmitool/src/plugins/lanplus/lanplus.c +++ b/ipmitool/src/plugins/lanplus/lanplus.c @@ -321,7 +321,7 @@ ipmi_req_lookup_entry(uint8_t seq, uint8_t cmd) static void ipmi_req_remove_entry(uint8_t seq, uint8_t cmd) { - struct ipmi_rq_entry * p, * e; + struct ipmi_rq_entry * p, * e, * saved_next_entry; e = p = ipmi_req_entries; @@ -332,13 +332,16 @@ ipmi_req_remove_entry(uint8_t seq, uint8_t cmd) if (e) { lprintf(LOG_DEBUG+3, "removed list entry seq=0x%02x cmd=0x%02x", seq, cmd); + saved_next_entry = e->next; p->next = (p->next == e->next) ? NULL : e->next; + /* If entry being removed is first in list, fix up list head */ if (ipmi_req_entries == e) { if (ipmi_req_entries != p) ipmi_req_entries = p; else - ipmi_req_entries = NULL; + ipmi_req_entries = saved_next_entry; } + /* If entry being removed is last in list, fix up list tail */ if (ipmi_req_entries_tail == e) { if (ipmi_req_entries_tail != p) ipmi_req_entries_tail = p;