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);

-- 

Reply via email to