From: Antonio Borneo Date: Fri, 15 Feb 2019 20:26:27 +0000 (+0100) Subject: mem_ap: fix a potential memory leak in mem_ap_target_create() X-Git-Tag: v0.11.0-rc1~831 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=1c6f7075f75db1e4da3b918a8c64f2b178712942;ds=sidebyside mem_ap: fix a potential memory leak in mem_ap_target_create() If the function mem_ap_target_create() exits for an error, the value of pointer mem_ap get lost, causing a memory leak. Move the allocation of mem_ap 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: Ia2c11b14fde9694f28bf6efe01d278923db0f0d4 Signed-off-by: Antonio Borneo Reviewed-on: http://openocd.zylin.com/4923 Reviewed-by: Tomas Vanek Tested-by: jenkins Reviewed-by: Matthias Welwarsky --- diff --git a/src/target/mem_ap.c b/src/target/mem_ap.c index 3a2d4b7c52..584e19d4c9 100644 --- a/src/target/mem_ap.c +++ b/src/target/mem_ap.c @@ -31,7 +31,7 @@ struct mem_ap { static int mem_ap_target_create(struct target *target, Jim_Interp *interp) { - struct mem_ap *mem_ap = calloc(1, sizeof(struct mem_ap)); + struct mem_ap *mem_ap; struct adiv5_private_config *pc; pc = (struct adiv5_private_config *)target->private_config; @@ -43,6 +43,12 @@ static int mem_ap_target_create(struct target *target, Jim_Interp *interp) return ERROR_FAIL; } + mem_ap = calloc(1, sizeof(struct mem_ap)); + if (mem_ap == NULL) { + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } + mem_ap->ap_num = pc->ap_num; mem_ap->arm.common_magic = ARM_COMMON_MAGIC; mem_ap->arm.dap = pc->dap;