target,flash: allow target_free_working_area on NULL area pointer 12/6712/4
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);

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)