aboutsummaryrefslogtreecommitdiffstats
path: root/stlinkv3_spi.c
diff options
context:
space:
mode:
authorAnastasia Klimchuk <aklm@chromium.org>2021-05-14 14:01:34 +1000
committerEdward O'Callaghan <quasisec@chromium.org>2021-05-19 02:09:43 +0000
commitcee470ecefbfdf7a1d08cb9d5cf3824c0f76e5c5 (patch)
tree4ee92ec2701d671f350a949611b98c3167aee78a /stlinkv3_spi.c
parentfbc38c71589910876466fd385a1f64f1c0c40eb7 (diff)
downloadflashrom-cee470ecefbfdf7a1d08cb9d5cf3824c0f76e5c5.tar.gz
flashrom-cee470ecefbfdf7a1d08cb9d5cf3824c0f76e5c5.tar.bz2
flashrom-cee470ecefbfdf7a1d08cb9d5cf3824c0f76e5c5.zip
stlinkv3_spi.c: Clean up properly on all init error paths
If register_spi_master() fails, going to init exit cleanup is not needed because at that point shutdown function has already been registered and it does the job. BUG=b:185191942 TEST=builds Change-Id: I9fabf48068635593bc86006c9642d8569eee8447 Signed-off-by: Anastasia Klimchuk <aklm@chromium.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/54190 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org> Reviewed-by: Miklós Márton <martonmiklosqdev@gmail.com>
Diffstat (limited to 'stlinkv3_spi.c')
-rw-r--r--stlinkv3_spi.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/stlinkv3_spi.c b/stlinkv3_spi.c
index 7712ec21..100a94b2 100644
--- a/stlinkv3_spi.c
+++ b/stlinkv3_spi.c
@@ -464,6 +464,7 @@ int stlinkv3_spi_init(void)
char *speed_str = NULL;
char *serialno = NULL;
char *endptr = NULL;
+ int ret = 1;
libusb_init(&usb_ctx);
if (!usb_ctx) {
@@ -485,7 +486,7 @@ int stlinkv3_spi_init(void)
else
msg_perr("Could not find any connected STLINK-V3\n");
free(serialno);
- goto err_exit;
+ goto init_err_exit;
}
free(serialno);
@@ -498,23 +499,30 @@ int stlinkv3_spi_init(void)
msg_perr("Please pass the parameter "
"with a simple non-zero number in kHz\n");
free(speed_str);
- return -1;
+ ret = -1;
+ goto init_err_exit;
}
free(speed_str);
}
if (stlinkv3_spi_open(sck_freq_kHz))
- goto err_exit;
+ goto init_err_exit;
if (register_shutdown(stlinkv3_spi_shutdown, NULL))
- goto err_exit;
+ goto init_err_cleanup_exit;
if (register_spi_master(&spi_programmer_stlinkv3, NULL))
- goto err_exit;
+ return 1; /* shutdown function does cleanup */
return 0;
-err_exit:
- libusb_exit(usb_ctx);
+init_err_cleanup_exit:
+ stlinkv3_spi_shutdown(NULL);
return 1;
+
+init_err_exit:
+ if (stlinkv3_handle)
+ libusb_close(stlinkv3_handle);
+ libusb_exit(usb_ctx);
+ return ret;
}