This is an automated email from Gerrit.

Antonio Borneo ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/4925

-- gerrit

commit 1f9c01d4ee7ff01d92e78e13f14b3bc036f4182c
Author: Antonio Borneo <[email protected]>
Date:   Fri Feb 15 21:33:34 2019 +0100

    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 <[email protected]>

diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c
index 648317e..9203fb9 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);

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to