diff options
author | Thomas Heijligen <thomas.heijligen@secunet.com> | 2022-09-13 19:14:32 +0200 |
---|---|---|
committer | Felix Singer <felixsinger@posteo.net> | 2022-09-14 03:40:09 +0000 |
commit | 50ea017af66b38f83ce8ef475cb5cf2eb09275d3 (patch) | |
tree | 975f5ba5f1298542876b988c9d378c002d64d634 | |
parent | 74698d21653e4112f6afda48c4616ea7fea1dfc4 (diff) | |
download | flashrom-50ea017af66b38f83ce8ef475cb5cf2eb09275d3.tar.gz flashrom-50ea017af66b38f83ce8ef475cb5cf2eb09275d3.tar.bz2 flashrom-50ea017af66b38f83ce8ef475cb5cf2eb09275d3.zip |
Revert "flashrom.c: Remove programmer_param global state"
This reverts commit 3b8b93e17f6ad861acb2a0810ae1dcf03285fb10.
Invoking flashrom with no parameters crashes when calling strdup(NULL)
in programmer_init().
Change-Id: I3b689ad4bdd0c9c3b11f30becafc878c78630f0b
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/67621
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Felix Singer <felixsinger@posteo.net>
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Jonathon Hall <jonathon.hall@puri.sm>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
-rw-r--r-- | flashrom.c | 52 |
1 files changed, 25 insertions, 27 deletions
@@ -38,6 +38,7 @@ const char flashrom_version[] = FLASHROM_VERSION; const char *chip_to_probe = NULL; static const struct programmer_entry *programmer = NULL; +static const char *programmer_param = NULL; /* * Programmers supporting multiple buses can have differing size limits on @@ -125,28 +126,10 @@ static int deregister_chip_restore(struct flashctx *flash) return rc; } -static int get_param_residue(const char *prog_params, int ret) -{ - if (prog_params && strlen(prog_params)) { - if (ret != 0) { - /* It is quite possible that any unhandled programmer parameter would have been valid, - * but an error in actual programmer init happened before the parameter was evaluated. - */ - msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n", prog_params); - } else { - /* Actual programmer init was successful, but the user specified an invalid or unusable - * (for the current programmer configuration) parameter. - */ - msg_perr("Unhandled programmer parameters: %s\n", prog_params); - msg_perr("Aborting.\n"); - ret = ERROR_FATAL; - } - } - return ret; -} - int programmer_init(const struct programmer_entry *prog, const char *param) { + int ret; + if (prog == NULL) { msg_perr("Invalid programmer specified!\n"); return -1; @@ -167,11 +150,25 @@ int programmer_init(const struct programmer_entry *prog, const char *param) /* Default to allowing writes. Broken programmers set this to 0. */ programmer_may_write = true; - msg_pdbg("Initializing %s programmer\n", prog->name); - const struct programmer_cfg cfg = { .params = strdup(param) }; - int ret = prog->init(&cfg); - ret = get_param_residue(cfg.params, ret); - free(cfg.params); + programmer_param = param; + msg_pdbg("Initializing %s programmer\n", programmer->name); + ret = programmer->init(NULL); + if (programmer_param && strlen(programmer_param)) { + if (ret != 0) { + /* It is quite possible that any unhandled programmer parameter would have been valid, + * but an error in actual programmer init happened before the parameter was evaluated. + */ + msg_pwarn("Unhandled programmer parameters (possibly due to another failure): %s\n", + programmer_param); + } else { + /* Actual programmer init was successful, but the user specified an invalid or unusable + * (for the current programmer configuration) parameter. + */ + msg_perr("Unhandled programmer parameters: %s\n", programmer_param); + msg_perr("Aborting.\n"); + ret = ERROR_FATAL; + } + } return ret; } @@ -191,6 +188,7 @@ int programmer_shutdown(void) ret |= shutdown_fn[i].func(shutdown_fn[i].data); } + programmer_param = NULL; registered_master_count = 0; return ret; @@ -229,7 +227,7 @@ int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, * needle and remove everything from the first occurrence of needle to the next * delimiter from haystack. */ -static char *extract_param(char *const *haystack, const char *needle, const char *delim) +static char *extract_param(const char *const *haystack, const char *needle, const char *delim) { char *param_pos, *opt_pos, *rest; char *opt = NULL; @@ -287,7 +285,7 @@ static char *extract_param(char *const *haystack, const char *needle, const char char *extract_programmer_param_str(const struct programmer_cfg *cfg, const char *param_name) { - return extract_param(&cfg->params, param_name, ","); + return extract_param(&programmer_param, param_name, ","); } static int check_block_eraser(const struct flashctx *flash, int k, int log) |