This is an automated email from Gerrit. "Kendall Goto <[email protected]>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/9569
-- gerrit commit 842fdd790f4ba8845112b3554d0bb22a205536d5 Author: Kendall Goto <[email protected]> Date: Wed Apr 8 11:12:41 2026 -0700 jtag: ensure jtag_all_taps is fully reset during adapter_quit Previously, we free each tap during the adapter_quit process, but we don't actually reset the list. This moves the jtag_tap_free logic to its own function and ensures the list returns to an empty NULL list, rather than pointing to freed addresses, allowing the list to be reused. Change-Id: I79454520173229e9c8229d0735d7cacaf7fe4a43 Signed-off-by: Kendall Goto <[email protected]> diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c index 7bf049cd86..e4780c9a12 100644 --- a/src/jtag/adapter.c +++ b/src/jtag/adapter.c @@ -197,12 +197,7 @@ int adapter_quit(void) free(adapter_config.serial); free(adapter_config.usb_location); - struct jtag_tap *t = jtag_all_taps(); - while (t) { - struct jtag_tap *n = t->next_tap; - jtag_tap_free(t); - t = n; - } + jtag_all_taps_free(); return ERROR_OK; } diff --git a/src/jtag/core.c b/src/jtag/core.c index 941d9f3b4c..1e74d009a2 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -1511,6 +1511,18 @@ void jtag_tap_free(struct jtag_tap *tap) free(tap); } +/** Free chain of taps. */ +void jtag_all_taps_free(void) +{ + struct jtag_tap *t = __jtag_all_taps; + while (t) { + struct jtag_tap *n = t->next_tap; + jtag_tap_free(t); + t = n; + } + __jtag_all_taps = NULL; +} + int jtag_init_inner(struct command_context *cmd_ctx) { struct jtag_tap *tap; diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 47efdff37c..c8f30f6b63 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -147,6 +147,7 @@ void jtag_tap_init(struct jtag_tap *tap); void jtag_tap_free(struct jtag_tap *tap); struct jtag_tap *jtag_all_taps(void); +void jtag_all_taps_free(void); const char *jtag_tap_name(const struct jtag_tap *tap); struct jtag_tap *jtag_tap_by_string(const char *dotted_name); struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *obj); --
