This is an automated email from Gerrit.

"zapb <[email protected]>" just uploaded a new patch set to Gerrit, which you can 
find at https://review.openocd.org/c/openocd/+/9736

-- gerrit

commit d55ef4bacede2fbe68d5c98ed970023b3377f15f
Author: Marc Schink <[email protected]>
Date:   Wed Jun 10 09:19:14 2026 +0200

    adapter/jtag_vpi: Fix memory leak
    
    Fix memory leak related to jtag_build_buffer() across different code
    paths. Regression tested with JTAG VPI server [1].
    
    [1] https://github.com/fjullien/jtag_vpi
    
    Change-Id: Ic9e75b9cad2ddd3bce7b69738ad75b23b354f363
    Signed-off-by: Marc Schink <[email protected]>

diff --git a/src/jtag/drivers/jtag_vpi.c b/src/jtag/drivers/jtag_vpi.c
index 18656b7973..525b4bee58 100644
--- a/src/jtag/drivers/jtag_vpi.c
+++ b/src/jtag/drivers/jtag_vpi.c
@@ -386,12 +386,9 @@ static int jtag_vpi_clock_tms(int tms)
  */
 static int jtag_vpi_scan(struct scan_command *cmd)
 {
-       int scan_bits;
        uint8_t *buf = NULL;
        int retval = ERROR_OK;
 
-       scan_bits = jtag_build_buffer(cmd, &buf);
-
        if (cmd->ir_scan) {
                retval = jtag_vpi_state_move(TAP_IRSHIFT);
                if (retval != ERROR_OK)
@@ -402,14 +399,20 @@ static int jtag_vpi_scan(struct scan_command *cmd)
                        return retval;
        }
 
+       int scan_bits = jtag_build_buffer(cmd, &buf);
+
        if (cmd->end_state == TAP_DRSHIFT) {
                retval = jtag_vpi_queue_tdi(buf, scan_bits, NO_TAP_SHIFT);
-               if (retval != ERROR_OK)
+               if (retval != ERROR_OK) {
+                       free(buf);
                        return retval;
+               }
        } else {
                retval = jtag_vpi_queue_tdi(buf, scan_bits, TAP_SHIFT);
-               if (retval != ERROR_OK)
+               if (retval != ERROR_OK) {
+                       free(buf);
                        return retval;
+               }
        }
 
        if (cmd->end_state != TAP_DRSHIFT) {
@@ -418,8 +421,10 @@ static int jtag_vpi_scan(struct scan_command *cmd)
                 * forward to a stable IRPAUSE or DRPAUSE.
                 */
                retval = jtag_vpi_clock_tms(0);
-               if (retval != ERROR_OK)
+               if (retval != ERROR_OK) {
+                       free(buf);
                        return retval;
+               }
 
                if (cmd->ir_scan)
                        tap_set_state(TAP_IRPAUSE);
@@ -428,8 +433,10 @@ static int jtag_vpi_scan(struct scan_command *cmd)
        }
 
        retval = jtag_read_buffer(buf, cmd);
-       if (retval != ERROR_OK)
+       if (retval != ERROR_OK) {
+               free(buf);
                return retval;
+       }
 
        free(buf);
 

-- 

Reply via email to