From 499294c2ab9935bc1fa1ce1e8bdcee66b50ddc65 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sat, 26 May 2012 14:12:52 +0200 Subject: [PATCH] CtdlUnregisterRoomHook(): fix possible nullpointer deref --- citadel/serv_extensions.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index 32cf53970..fe15aa785 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -757,18 +757,25 @@ void CtdlRegisterRoomHook(int (*fcn_ptr)(struct ctdlroom *)) void CtdlUnregisterRoomHook(int (*fcn_ptr)(struct ctdlroom *)) { - RoomFunctionHook *cur, *p; + RoomFunctionHook *cur, *p, *last; - for (cur = RoomHookTable; cur != NULL; cur = cur->next) { - while (cur != NULL && fcn_ptr == cur->fcn_ptr) { + for (last = NULL, cur = RoomHookTable; + cur != NULL; + cur = cur->next) + { + if (fcn_ptr == cur->fcn_ptr) { MODM_syslog(LOG_DEBUG, "Unregistered room function\n"); p = cur->next; - if (cur == RoomHookTable) { - RoomHookTable = p; - } + free(cur); - cur = p; + cur = NULL; + + if (last != NULL) + last->next = p; + else + RoomHookTable = p; } + last = cur; } } -- 2.30.2