target/xtensa: fix memory leaks in reg_cache

There are two allocated fields that are never freed,
contiguous_regs_desc and contiguous_regs_list.
Additionally, prevent memory leaks and invalid accesses
when xtregs command is called repeatedly.

Change-Id: Id6ab4a2565ddb19e1e9d3f1c3b822182b3a6fb9d
Signed-off-by: Samuel Obuch <samuel.obuch@espressif.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/9113
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Tested-by: jenkins
Reviewed-by: Ian Thompson <ianst+cdns@cadence.com>
This commit is contained in:
Samuel Obuch
2025-09-08 13:25:04 +02:00
committed by Antonio Borneo
parent 587c783103
commit 28eb4c37b9

View File

@@ -3493,6 +3493,10 @@ static void xtensa_free_reg_cache(struct target *target)
free(xtensa->optregs);
}
xtensa->optregs = NULL;
free(xtensa->contiguous_regs_desc);
xtensa->contiguous_regs_desc = NULL;
free(xtensa->contiguous_regs_list);
xtensa->contiguous_regs_list = NULL;
}
void xtensa_target_deinit(struct target *target)
@@ -3896,6 +3900,10 @@ COMMAND_HELPER(xtensa_cmd_xtreg_do, struct xtensa *xtensa)
xtensa->total_regs_num = numregs;
xtensa->core_regs_num = 0;
xtensa->num_optregs = 0;
/* Prevent memory leak in case xtregs is called twice */
free(xtensa->optregs);
free(xtensa->contiguous_regs_desc);
xtensa->contiguous_regs_desc = NULL;
/* A little more memory than required, but saves a second initialization pass */
xtensa->optregs = calloc(xtensa->total_regs_num, sizeof(struct xtensa_reg_desc));
if (!xtensa->optregs) {