summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-09-27 16:45:25 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-09-27 16:46:13 +0200
commit45e5d1d90acaff8cf57f694e70ec41ece9bddfcd (patch)
tree0f760fcce17da5def27f7501a64224d4832d9bab /src
parent19167a7af6053f1eba0420509408731db007368c (diff)
downloadopenocd+libswd-45e5d1d90acaff8cf57f694e70ec41ece9bddfcd.tar.gz
openocd+libswd-45e5d1d90acaff8cf57f694e70ec41ece9bddfcd.tar.bz2
openocd+libswd-45e5d1d90acaff8cf57f694e70ec41ece9bddfcd.tar.xz
openocd+libswd-45e5d1d90acaff8cf57f694e70ec41ece9bddfcd.zip
flash: fix error handling
memory leaks and missing check on memory allocation. Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src')
-rw-r--r--src/flash/nor/core.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c
index d200d8c8..2c1d9dee 100644
--- a/src/flash/nor/core.c
+++ b/src/flash/nor/core.c
@@ -601,7 +601,9 @@ int flash_write_unlock(struct target *target, struct image *image,
/* find the corresponding flash bank */
retval = get_flash_bank_by_addr(target, run_address, false, &c);
if (retval != ERROR_OK)
- return retval;
+ {
+ goto done;
+ }
if (c == NULL)
{
section++; /* and skip it */
@@ -653,7 +655,8 @@ int flash_write_unlock(struct target *target, struct image *image,
if (run_address + run_size - 1 > c->base + c->size - 1)
{
LOG_ERROR("The image is too big for the flash");
- return ERROR_FAIL;
+ retval = ERROR_FAIL;
+ goto done;
}
/* If we're applying any sector automagic, then pad this
@@ -679,6 +682,12 @@ int flash_write_unlock(struct target *target, struct image *image,
/* allocate buffer */
buffer = malloc(run_size);
+ if (buffer == NULL)
+ {
+ LOG_ERROR("Out of memory for flash bank buffer");
+ retval = ERROR_FAIL;
+ goto done;
+ }
buffer_size = 0;
/* read sections to the buffer */