Fix for issue described in the following mail https://lists.berlios.de/pipermail/openocd-development/2010-December/017479.html
From c78f5203622438e73580c327a6e55a0df17b85a8 Mon Sep 17 00:00:00 2001 From: Paul Richards <[email protected]> Date: Wed, 8 Dec 2010 15:48:55 +0900 Subject: [PATCH] Fix for segmentation fault from freed memory access in jtag_unregister_event_callback() --- src/jtag/core.c | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/jtag/core.c b/src/jtag/core.c index c1b64bb..4f75e1c 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -296,27 +296,25 @@ int jtag_register_event_callback(jtag_event_handler_t callback, void *priv) int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv) { - struct jtag_event_callback **callbacks_p; - struct jtag_event_callback **next; + struct jtag_event_callback **callbacks_p = &jtag_event_callbacks; if (callback == NULL) { return ERROR_INVALID_ARGUMENTS; } - for (callbacks_p = &jtag_event_callbacks; - *callbacks_p != NULL; - callbacks_p = next) + while (*callbacks_p != NULL) { - next = &((*callbacks_p)->next); - - if ((*callbacks_p)->priv != priv) - continue; + if (((*callbacks_p)->priv != priv) && ((*callbacks_p)->callback == callback)) + { + struct jtag_event_callback *free_callback = *callbacks_p; - if ((*callbacks_p)->callback == callback) + *callbacks_p = (*callbacks_p)->next; + free(free_callback); + } + else { - free(*callbacks_p); - *callbacks_p = *next; + callbacks_p = &((*callbacks_p)->next); } } -- 1.7.2.3
_______________________________________________ Openocd-development mailing list [email protected] https://lists.berlios.de/mailman/listinfo/openocd-development
