From eaa6d8f8392cec3fdef2fafab9af06ab627de445 Mon Sep 17 00:00:00 2001
From: Paul Fertser <fercerpav@gmail.com>
Date: Sun, 5 Apr 2015 00:16:59 +0300
Subject: [PATCH] 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
---
 src/flash/nor/lpc2000.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/flash/nor/lpc2000.c b/src/flash/nor/lpc2000.c
index 15d9eb81c..0247e66df 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;
 }
-- 
GitLab