armv4_5: Improve arm_checksum_memory() error handling
authorAndreas Färber <afaerber@suse.de>
Sun, 8 May 2016 18:18:49 +0000 (20:18 +0200)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sun, 22 May 2016 14:49:17 +0000 (15:49 +0100)
Clean up the working area in case writing fails.
Change the error handling paradigm to avoid duplication.

Change-Id: Ie3f95f992a98a1325428e4032a1c17346d4c9977
Signed-off-by: Andreas Färber <afaerber@suse.de>
Reviewed-on: http://openocd.zylin.com/3472
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/target/armv4_5.c

index 18ce7df316c5f7e4397315a5dda1ef096510bec1..ba873b05b3bf9214eddecead67acd84cb367bbaf 100644 (file)
@@ -1467,7 +1467,7 @@ int arm_checksum_memory(struct target *target,
                                crc_algorithm->address + i * sizeof(uint32_t),
                                arm_crc_code[i]);
                if (retval != ERROR_OK)
-                       return retval;
+                       goto cleanup;
        }
 
        arm_algo.common_magic = ARM_COMMON_MAGIC;
@@ -1491,22 +1491,19 @@ int arm_checksum_memory(struct target *target,
                        crc_algorithm->address,
                        exit_var,
                        timeout, &arm_algo);
-       if (retval != ERROR_OK) {
-               LOG_ERROR("error executing ARM crc algorithm");
-               destroy_reg_param(&reg_params[0]);
-               destroy_reg_param(&reg_params[1]);
-               target_free_working_area(target, crc_algorithm);
-               return retval;
-       }
 
-       *checksum = buf_get_u32(reg_params[0].value, 0, 32);
+       if (retval == ERROR_OK)
+               *checksum = buf_get_u32(reg_params[0].value, 0, 32);
+       else
+               LOG_ERROR("error executing ARM crc algorithm");
 
        destroy_reg_param(&reg_params[0]);
        destroy_reg_param(&reg_params[1]);
 
+cleanup:
        target_free_working_area(target, crc_algorithm);
 
-       return ERROR_OK;
+       return retval;
 }
 
 /**