From: Paul Fertser Date: Sat, 4 Apr 2015 21:16:59 +0000 (+0300) Subject: flash/nor/lpc2000: free allocated working area when target_write fails X-Git-Tag: v0.9.0-rc1~27 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=eaa6d8f8392cec3fdef2fafab9af06ab627de445 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 Reviewed-on: http://openocd.zylin.com/2696 Tested-by: jenkins --- diff --git a/src/flash/nor/lpc2000.c b/src/flash/nor/lpc2000.c index 15d9eb81c5..0247e66df3 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; }