From 28eb4c37b9bbb06a3b6e96e1187e789f6132caf4 Mon Sep 17 00:00:00 2001 From: Samuel Obuch Date: Mon, 8 Sep 2025 13:25:04 +0200 Subject: [PATCH] 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 Reviewed-on: https://review.openocd.org/c/openocd/+/9113 Reviewed-by: Antonio Borneo Tested-by: jenkins Reviewed-by: Ian Thompson --- src/target/xtensa/xtensa.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/target/xtensa/xtensa.c b/src/target/xtensa/xtensa.c index f8c36b01d..faf57fc2e 100644 --- a/src/target/xtensa/xtensa.c +++ b/src/target/xtensa/xtensa.c @@ -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) {