diff --git a/cli_classic.c b/cli_classic.c index a0c2d64a2..a32d55b31 100644 --- a/cli_classic.c +++ b/cli_classic.c @@ -338,8 +338,7 @@ int main(int argc, char *argv[]) if (logfile && check_filename(logfile, "log")) cli_classic_abort_usage(); if (logfile && open_logfile(logfile)) - return 1; - free(logfile); + cli_classic_abort_usage(); #endif /* !STANDALONE */ #if CONFIG_PRINT_WIKI == 1 @@ -522,8 +521,6 @@ int main(int argc, char *argv[]) */ programmer_delay(100000); ret |= doit(fill_flash, force, filename, read_it, write_it, erase_it, verify_it); - /* Note: doit() already calls programmer_shutdown(). */ - goto out; out_shutdown: programmer_shutdown(); @@ -539,6 +536,7 @@ out: free((char *)chip_to_probe); /* Silence! Freeing is not modifying contents. */ chip_to_probe = NULL; #ifndef STANDALONE + free(logfile); ret |= close_logfile(); #endif /* !STANDALONE */ return ret; diff --git a/flashrom.c b/flashrom.c index 23728f635..c20461a9a 100644 --- a/flashrom.c +++ b/flashrom.c @@ -413,6 +413,11 @@ int programmer_init(enum programmer prog, const char *param) return ret; } +/** Calls registered shutdown functions and resets internal programmer-related variables. + * Calling it is safe even without previous initialization, but further interactions with programmer support + * require a call to programmer_init() (afterwards). + * + * @return The OR-ed result values of all shutdown functions (i.e. 0 on success). */ int programmer_shutdown(void) { int ret = 0; @@ -1913,14 +1918,12 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) { msg_cerr("Aborting.\n"); - ret = 1; - goto out_nofree; + return 1; } if (normalize_romentries(flash)) { msg_cerr("Requested regions can not be handled. Aborting.\n"); - ret = 1; - goto out_nofree; + return 1; } /* Given the existence of read locks, we want to unlock for read, @@ -1930,8 +1933,7 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, flash->chip->unlock(flash); if (read_it) { - ret = read_flash_to_file(flash, filename); - goto out_nofree; + return read_flash_to_file(flash, filename); } oldcontents = malloc(size); @@ -2048,7 +2050,5 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, out: free(oldcontents); free(newcontents); -out_nofree: - programmer_shutdown(); return ret; }