bootstd: Fix memleak on errors in bootmeth_setup_iter_order()

Free memory allocated for 'order' (array of bootmeths) on error paths in
bootmeth_setup_iter_order() function.

Fixes: c627cfc14c ("bootstd: Allow scanning for global bootmeths separately")
Fixes: 10d16faa43 ("bootstd: Detect empty bootmeth")
Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Sam Protsenko
2025-01-11 21:42:11 -06:00
committed by Tom Rini
parent 4bbfd1c042
commit 11319e0e2b

View File

@@ -135,8 +135,10 @@ int bootmeth_setup_iter_order(struct bootflow_iter *iter, bool include_global)
* We don't support skipping global bootmeths. Instead, the user
* should omit them from the ordering
*/
if (!include_global)
return log_msg_ret("glob", -EPERM);
if (!include_global) {
ret = log_msg_ret("glob", -EPERM);
goto err_order;
}
memcpy(order, std->bootmeth_order,
count * sizeof(struct bootmeth *));
@@ -190,8 +192,10 @@ int bootmeth_setup_iter_order(struct bootflow_iter *iter, bool include_global)
}
count = upto;
}
if (!count)
return log_msg_ret("count2", -ENOENT);
if (!count) {
ret = log_msg_ret("count2", -ENOENT);
goto err_order;
}
if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL) && include_global &&
iter->first_glob_method != -1 && iter->first_glob_method != count) {
@@ -202,6 +206,10 @@ int bootmeth_setup_iter_order(struct bootflow_iter *iter, bool include_global)
iter->num_methods = count;
return 0;
err_order:
free(order);
return ret;
}
int bootmeth_set_order(const char *order_str)