target,flash: allow target_free_working_area on NULL area pointer
authorTomas Vanek <vanekt@fbl.cz>
Thu, 18 Nov 2021 08:37:23 +0000 (09:37 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Fri, 3 Dec 2021 21:59:20 +0000 (21:59 +0000)
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 <vanekt@fbl.cz>
Reviewed-on: https://review.openocd.org/c/openocd/+/6712
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/flash/nor/cc26xx.c
src/flash/nor/cfi.c
src/flash/nor/fespi.c
src/flash/nor/msp432.c
src/flash/nor/npcx.c
src/flash/nor/psoc6.c
src/flash/nor/sh_qspi.c
src/target/riscv/riscv-013.c
src/target/target.c
src/target/target.h

index f6b56327934b5a44123eb51f0263eee83f4c8670..7e526492bc0301e1c99290e9d5fd58280a7a75a5 100644 (file)
@@ -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;
        }
 
index e3fb6c8ff82a7f93999c9c6df6147155de68b1cb..85115869d582cd8ffb56ffc72a512d0cc8d4c80b 100644 (file)
@@ -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]);
index 11da818547ea3289c64097e6e12eaf025cad2adb..5474ffae4b0750cdc4c6304f2af1bc1db606d8b4 100644 (file)
@@ -661,10 +661,8 @@ static int fespi_write(struct flash_bank *bank, const uint8_t *buffer,
        return ERROR_OK;
 
 err:
-       if (algorithm_wa) {
-               target_free_working_area(target, data_wa);
-               target_free_working_area(target, algorithm_wa);
-       }
+       target_free_working_area(target, data_wa);
+       target_free_working_area(target, algorithm_wa);
 
        /* Switch to HW mode before return to prompt */
        if (fespi_enable_hw_mode(bank) != ERROR_OK)
index 667349f281c5e55d88dd267d8bee370ed13c5be7..61741c8d6811a85f0c8c958f054ac85e58892593 100644 (file)
@@ -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)
index af623e577562e51f2aa39ccdd2510d7b01c579b4..a4d639524b9e8725a9a5f789f01541f65b57e63f 100644 (file)
@@ -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);
index 198dff5c83c993391693c62ed64ad9d485706a99..c6166aff8f8d924d713188ac4ff503506b8a2a2d 100644 (file)
@@ -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;
 }
index a1598449c1766d1bbdfb071b91791ebaf6897f12..02af17acd66526d0d547f4d7a2bc65c437e4950b 100644 (file)
@@ -703,11 +703,14 @@ 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: Working 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.
+        * Not a big problem if area backp is off.
+        */
        /* flash write code */
        if (target_alloc_working_area(target, sizeof(sh_qspi_io_code),
                        &info->io_algorithm) != ERROR_OK) {
index 006266a90c5e93190d2859013f9ed11c621e4074..7af460241b20cf8a8f4ab714397c22598bf8edad 100644 (file)
@@ -1199,10 +1199,7 @@ static int scratch_reserve(struct target *target,
 static int scratch_release(struct target *target,
                scratch_mem_t *scratch)
 {
-       if (scratch->area)
-               return target_free_working_area(target, scratch->area);
-
-       return ERROR_OK;
+       return target_free_working_area(target, scratch->area);
 }
 
 static int scratch_read64(struct target *target, scratch_mem_t *scratch,
index ed6f655eac68607285030188b894db34141a4979..27888a83e1a153d8c7cef38635559bc0b5b734ca 100644 (file)
@@ -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;
 }
 
index 99ec2be104b178a49fa08a241775045fa77ee04f..6ef8f10e0719396b027cd2f50edd9e9a0b41c3d0 100644 (file)
@@ -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);