diff options
author | Sam Mendoza-Jonas <sam@mendozajonas.com> | 2016-03-15 13:35:21 +1100 |
---|---|---|
committer | Samuel Mendoza-Jonas <sam@mendozajonas.com> | 2016-03-23 09:02:35 +1100 |
commit | 66ff1c8d36be43e53831a7ada7e2d10bac516afe (patch) | |
tree | 304ed6b0adf780abe3a42fded66084e91cb08a0a | |
parent | aae41a6e324cb37c7af93ae8726110ff82728fa6 (diff) | |
download | petitboot-66ff1c8d36be43e53831a7ada7e2d10bac516afe.zip petitboot-66ff1c8d36be43e53831a7ada7e2d10bac516afe.tar.gz |
discover/boot: Safely cleanup after failed load
If a call to load_url_async() fails immediately, boot() will free the
boot task and return. If other jobs started by load_url_async()
are still running they will attempt to free their task struct in
load_url_process_exit(), however the original boot task is the parent
context of this process task, resulting in a double-free.
Instead call cleanup_cancellations if an error immediately occurs to
cancel any pending load operations safely before freeing the boot task.
Signed-off-by: Sam Mendoza-Jonas <sam@mendozajonas.com>
-rw-r--r-- | discover/boot.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/discover/boot.c b/discover/boot.c index 7778b3f..0d3491f 100644 --- a/discover/boot.c +++ b/discover/boot.c @@ -486,9 +486,10 @@ struct boot_task *boot(void *ctx, struct discover_boot_option *opt, || start_url_load(boot_task, "initrd", initrd, &boot_task->initrd) || start_url_load(boot_task, "dtb", dtb, &boot_task->dtb); - /* If all URLs are local, we may be done. */ if (rc) { - talloc_free(boot_task); + /* Don't call boot_cancel() to preserve the status update */ + boot_task->cancelled = true; + cleanup_cancellations(boot_task, NULL); return NULL; } |