diff options
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 |
commit | 45e5d1d90acaff8cf57f694e70ec41ece9bddfcd (patch) | |
tree | 0f760fcce17da5def27f7501a64224d4832d9bab /src | |
parent | 19167a7af6053f1eba0420509408731db007368c (diff) | |
download | openocd+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.c | 13 |
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 */ |