aboutsummaryrefslogtreecommitdiff
path: root/src/target/aarch64.c
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2019-02-15 21:31:02 +0100
committerTomas Vanek <vanekt@fbl.cz>2019-02-25 21:54:22 +0000
commitf473f84840d0c324df684c49744e32f086595bab (patch)
tree8f36bea37b06f2a0e1eb9c21997070028a32cde1 /src/target/aarch64.c
parent1c6f7075f75db1e4da3b918a8c64f2b178712942 (diff)
downloadriscv-openocd-f473f84840d0c324df684c49744e32f086595bab.zip
riscv-openocd-f473f84840d0c324df684c49744e32f086595bab.tar.gz
riscv-openocd-f473f84840d0c324df684c49744e32f086595bab.tar.bz2
aarch64: fix a potential memory leak in aarch64_target_create()
If the function aarch64_target_create() exits for an error, the value of pointer aarch64 get lost, causing a memory leak. Move the allocation of aarch64 after the check on the parameters. While there, add a check on the value returned by calloc(). Issue highlighted by clang 7.0.0. Change-Id: Ib9ad27f4acd940da308c01fdbf33cfe51ab0c639 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/4924 Reviewed-by: Tomas Vanek <vanekt@fbl.cz> Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
Diffstat (limited to 'src/target/aarch64.c')
-rw-r--r--src/target/aarch64.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/target/aarch64.c b/src/target/aarch64.c
index 63174c2..2357eb2 100644
--- a/src/target/aarch64.c
+++ b/src/target/aarch64.c
@@ -2396,11 +2396,17 @@ static int aarch64_init_arch_info(struct target *target,
static int aarch64_target_create(struct target *target, Jim_Interp *interp)
{
struct aarch64_private_config *pc = target->private_config;
- struct aarch64_common *aarch64 = calloc(1, sizeof(struct aarch64_common));
+ struct aarch64_common *aarch64;
if (adiv5_verify_config(&pc->adiv5_config) != ERROR_OK)
return ERROR_FAIL;
+ aarch64 = calloc(1, sizeof(struct aarch64_common));
+ if (aarch64 == NULL) {
+ LOG_ERROR("Out of memory");
+ return ERROR_FAIL;
+ }
+
return aarch64_init_arch_info(target, aarch64, pc->adiv5_config.dap);
}