From: Antonio Borneo Date: Fri, 15 Feb 2019 20:33:34 +0000 (+0100) Subject: cortex_a: fix a potential memory leak in cortex_a_target_create() X-Git-Tag: v0.11.0-rc1~832 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=3b39618eb5ab2bcceb00acaba3df303c4d9fa51e cortex_a: fix a potential memory leak in cortex_a_target_create() If the function cortex_a_target_create() or the function cortex_r4_target_create() exit for an error, the value of pointer cortex_a get lost, causing a memory leak. Move the allocation of cortex_a after the check on the parameters. While there, add checks on the value returned by calloc(). Issue highlighted by clang 7.0.0. Change-Id: Ic6eeb9c3b39922d016f6d0319eada1a97a6681f0 Signed-off-by: Antonio Borneo Reviewed-on: http://openocd.zylin.com/4925 Reviewed-by: Tomas Vanek Tested-by: jenkins Reviewed-by: Matthias Welwarsky --- diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c index 648317e492..9203fb9ec2 100644 --- a/src/target/cortex_a.c +++ b/src/target/cortex_a.c @@ -2840,8 +2840,7 @@ static int cortex_a_init_arch_info(struct target *target, static int cortex_a_target_create(struct target *target, Jim_Interp *interp) { - struct cortex_a_common *cortex_a = calloc(1, sizeof(struct cortex_a_common)); - cortex_a->common_magic = CORTEX_A_COMMON_MAGIC; + struct cortex_a_common *cortex_a; struct adiv5_private_config *pc; if (target->private_config == NULL) @@ -2849,8 +2848,13 @@ static int cortex_a_target_create(struct target *target, Jim_Interp *interp) pc = (struct adiv5_private_config *)target->private_config; + cortex_a = calloc(1, sizeof(struct cortex_a_common)); + if (cortex_a == NULL) { + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } + cortex_a->common_magic = CORTEX_A_COMMON_MAGIC; cortex_a->armv7a_common.is_armv7r = false; - cortex_a->armv7a_common.arm.arm_vfp_version = ARM_VFP_V3; return cortex_a_init_arch_info(target, cortex_a, pc->dap); @@ -2858,14 +2862,19 @@ static int cortex_a_target_create(struct target *target, Jim_Interp *interp) static int cortex_r4_target_create(struct target *target, Jim_Interp *interp) { - struct cortex_a_common *cortex_a = calloc(1, sizeof(struct cortex_a_common)); - cortex_a->common_magic = CORTEX_A_COMMON_MAGIC; + struct cortex_a_common *cortex_a; struct adiv5_private_config *pc; pc = (struct adiv5_private_config *)target->private_config; if (adiv5_verify_config(pc) != ERROR_OK) return ERROR_FAIL; + cortex_a = calloc(1, sizeof(struct cortex_a_common)); + if (cortex_a == NULL) { + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } + cortex_a->common_magic = CORTEX_A_COMMON_MAGIC; cortex_a->armv7a_common.is_armv7r = true; return cortex_a_init_arch_info(target, cortex_a, pc->dap);