This is an automated email from Gerrit.

"Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/6712

-- gerrit

commit 8db1cee95d419ad3344c3021626d48e2c6250a00
Author: Tomas Vanek <van...@fbl.cz>
Date:   Thu Nov 18 09:37:23 2021 +0100

    target,flash: allow target_free_working_area on NULL area pointer
    
    Standard C library free() allows NULL pointer as a parameter.
    
    Change target_free_working_area() to conform this convention.
    
    Remove NULL pointer tests before target_free_working_area() calls.
    
    While on it add missing setting pointer to NULL after 
target_free_working_area().
    
    Change-Id: I7c692ab04a9933398ba5bc614723ad0bdecb87b3
    Signed-off-by: Tomas Vanek <van...@fbl.cz>

diff --git a/src/flash/nor/cc26xx.c b/src/flash/nor/cc26xx.c
index f6b563279..7e526492b 100644
--- a/src/flash/nor/cc26xx.c
+++ b/src/flash/nor/cc26xx.c
@@ -140,8 +140,9 @@ static int cc26xx_init(struct flash_bank *bank)
                return retval;
 
        /* Check for working area to use for flash helper algorithm */
-       if (cc26xx_bank->working_area)
-               target_free_working_area(target, cc26xx_bank->working_area);
+       target_free_working_area(target, cc26xx_bank->working_area);
+       cc26xx_bank->working_area = NULL;
+
        retval = target_alloc_working_area(target, 
cc26xx_bank->algo_working_size,
                                &cc26xx_bank->working_area);
        if (retval != ERROR_OK)
@@ -158,6 +159,7 @@ static int cc26xx_init(struct flash_bank *bank)
                LOG_ERROR("%s: Failed to load flash helper algorithm",
                        cc26xx_bank->family_name);
                target_free_working_area(target, cc26xx_bank->working_area);
+               cc26xx_bank->working_area = NULL;
                return retval;
        }
 
@@ -172,6 +174,7 @@ static int cc26xx_init(struct flash_bank *bank)
                LOG_ERROR("%s: Failed to start flash helper algorithm",
                        cc26xx_bank->family_name);
                target_free_working_area(target, cc26xx_bank->working_area);
+               cc26xx_bank->working_area = NULL;
                return retval;
        }
 
diff --git a/src/flash/nor/cfi.c b/src/flash/nor/cfi.c
index e3fb6c8ff..85115869d 100644
--- a/src/flash/nor/cfi.c
+++ b/src/flash/nor/cfi.c
@@ -1359,9 +1359,7 @@ static int cfi_intel_write_block(struct flash_bank *bank, 
const uint8_t *buffer,
 
        /* free up resources */
 cleanup:
-       if (source)
-               target_free_working_area(target, source);
-
+       target_free_working_area(target, source);
        target_free_working_area(target, write_algorithm);
 
        destroy_reg_param(&reg_params[0]);
diff --git a/src/flash/nor/msp432.c b/src/flash/nor/msp432.c
index 667349f28..61741c8d6 100644
--- a/src/flash/nor/msp432.c
+++ b/src/flash/nor/msp432.c
@@ -335,8 +335,9 @@ static int msp432_init(struct flash_bank *bank)
        }
 
        /* Check for working area to use for flash helper algorithm */
-       if (msp432_bank->working_area)
-               target_free_working_area(target, msp432_bank->working_area);
+       target_free_working_area(target, msp432_bank->working_area);
+       msp432_bank->working_area = NULL;
+
        retval = target_alloc_working_area(target, ALGO_WORKING_SIZE,
                                &msp432_bank->working_area);
        if (retval != ERROR_OK)
diff --git a/src/flash/nor/npcx.c b/src/flash/nor/npcx.c
index af623e577..a4d639524 100644
--- a/src/flash/nor/npcx.c
+++ b/src/flash/nor/npcx.c
@@ -80,10 +80,8 @@ static int npcx_init(struct flash_bank *bank)
        struct npcx_flash_bank *npcx_bank = bank->driver_priv;
 
        /* Check for working area to use for flash helper algorithm */
-       if (npcx_bank->working_area) {
-               target_free_working_area(target, npcx_bank->working_area);
-               npcx_bank->working_area = NULL;
-       }
+       target_free_working_area(target, npcx_bank->working_area);
+       npcx_bank->working_area = NULL;
 
        int retval = target_alloc_working_area(target, 
npcx_bank->algo_working_size,
                                &npcx_bank->working_area);
diff --git a/src/flash/nor/psoc6.c b/src/flash/nor/psoc6.c
index d3a4b3702..2a9378919 100644
--- a/src/flash/nor/psoc6.c
+++ b/src/flash/nor/psoc6.c
@@ -182,10 +182,8 @@ destroy_rp_free_wa:
        /* Something went wrong, do some cleanup */
        destroy_reg_param(&reg_params);
 
-       if (g_stack_area) {
-               target_free_working_area(target, g_stack_area);
-               g_stack_area = NULL;
-       }
+       target_free_working_area(target, g_stack_area);
+       g_stack_area = NULL;
 
        return hr;
 }
diff --git a/src/flash/nor/sh_qspi.c b/src/flash/nor/sh_qspi.c
index a1598449c..8ef13497e 100644
--- a/src/flash/nor/sh_qspi.c
+++ b/src/flash/nor/sh_qspi.c
@@ -703,11 +703,13 @@ static int sh_qspi_upload_helper(struct flash_bank *bank)
        };
        int ret;
 
-       if (info->source)
-               target_free_working_area(target, info->source);
-       if (info->io_algorithm)
-               target_free_working_area(target, info->io_algorithm);
+       target_free_working_area(target, info->source);
+       target_free_working_area(target, info->io_algorithm);
 
+       /* FIXME: Workink areas are allocated during flash probe
+        * and eventual target_free_all_working_areas() called in case
+        * of target reset or run is not handled at all.
+        */
        /* flash write code */
        if (target_alloc_working_area(target, sizeof(sh_qspi_io_code),
                        &info->io_algorithm) != ERROR_OK) {
diff --git a/src/target/target.c b/src/target/target.c
index 35e9b5332..bb8c48893 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -2148,11 +2148,10 @@ static int target_restore_working_area(struct target 
*target, struct working_are
 /* Restore the area's backup memory, if any, and return the area to the 
allocation pool */
 static int target_free_working_area_restore(struct target *target, struct 
working_area *area, int restore)
 {
-       int retval = ERROR_OK;
-
-       if (area->free)
-               return retval;
+       if (!area || area->free)
+               return ERROR_OK;
 
+       int retval = ERROR_OK;
        if (restore) {
                retval = target_restore_working_area(target, area);
                /* REVISIT: Perhaps the area should be freed even if restoring 
fails. */
@@ -6401,8 +6400,7 @@ next:
 out:
        free(test_pattern);
 
-       if (wa)
-               target_free_working_area(target, wa);
+       target_free_working_area(target, wa);
 
        /* Test writes */
        num_bytes = test_size + 4 + 4 + 4;
@@ -6486,8 +6484,7 @@ nextw:
 
        free(test_pattern);
 
-       if (wa)
-               target_free_working_area(target, wa);
+       target_free_working_area(target, wa);
        return retval;
 }
 
diff --git a/src/target/target.h b/src/target/target.h
index 1e19434e4..5303302b8 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -726,6 +726,13 @@ int target_alloc_working_area(struct target *target,
  */
 int target_alloc_working_area_try(struct target *target,
                uint32_t size, struct working_area **area);
+/**
+ * Free a working area.
+ * Restore target data if area backup is configured.
+ * @param target
+ * @param area Pointer to the area to be freed or NULL
+ * @returns ERROR_OK if successful; error code if restore failed
+ */
 int target_free_working_area(struct target *target, struct working_area *area);
 void target_free_all_working_areas(struct target *target);
 uint32_t target_get_working_area_avail(struct target *target);

-- 

Reply via email to