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