summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Fertser <fercerpav@gmail.com>2015-04-05 00:16:59 +0300
committerPaul Fertser <fercerpav@gmail.com>2015-04-14 12:41:26 +0100
commiteaa6d8f8392cec3fdef2fafab9af06ab627de445 (patch)
treeb26e01faa1b7d91c3dd75c2ee53bba439f6e3804 /src
parent20a077eadbeea77ed3f4d75fbe23b6f2db891dd8 (diff)
downloadopenocd-eaa6d8f8392cec3fdef2fafab9af06ab627de445.tar.gz
openocd-eaa6d8f8392cec3fdef2fafab9af06ab627de445.tar.xz
flash/nor/lpc2000: free allocated working area when target_write fails
In some circumstances (e.g. inappropriate jtag clock) target_write_memory in lpc2000_iap_working_area_init might fail. The allocated working area should be freed inside lpc2000_iap_working_area_init in this error case. This was leading to a weird segfault due to stack corruption later when reset was executed. Reported by quitte (Jonas Meyer). Change-Id: Ia2ed42a9970a4d771727fd516a6eea88e9b859e2 Signed-off-by: Paul Fertser <fercerpav@gmail.com> Reviewed-on: http://openocd.zylin.com/2696 Tested-by: jenkins
Diffstat (limited to 'src')
-rw-r--r--src/flash/nor/lpc2000.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/flash/nor/lpc2000.c b/src/flash/nor/lpc2000.c
index 15d9eb81..0247e66d 100644
--- a/src/flash/nor/lpc2000.c
+++ b/src/flash/nor/lpc2000.c
@@ -679,9 +679,11 @@ static int lpc2000_iap_working_area_init(struct flash_bank *bank, struct working
}
int retval = target_write_memory(target, (*iap_working_area)->address, 4, 2, jump_gate);
- if (retval != ERROR_OK)
+ if (retval != ERROR_OK) {
LOG_ERROR("Write memory at address 0x%8.8" PRIx32 " failed (check work_area definition)",
(*iap_working_area)->address);
+ target_free_working_area(target, *iap_working_area);
+ }
return retval;
}