]> git.ozlabs.org Git - petitboot/commitdiff
discover: fix segfault on failed boot image load
authorJeremy Kerr <jk@ozlabs.org>
Thu, 1 Aug 2013 07:25:53 +0000 (15:25 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Thu, 1 Aug 2013 07:25:53 +0000 (15:25 +0800)
If the boot image fails to load, we end up calling talloc_free on an
unitialised are of stack (boot_task.local_initrd).

Move the initialisers a little earlier, so we always NULL pointers
before potentially freeing.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/boot.c

index ed30ef9fe085104d1e94f957d426e1c7555089e0..e57810d54d46a10687c0182d9004d63b0349d188 100644 (file)
@@ -321,6 +321,9 @@ int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd,
 
        result = -1;
 
 
        result = -1;
 
+       boot_task.local_initrd = NULL;
+       boot_task.local_dtb = NULL;
+
        update_status(status_fn, status_arg, BOOT_STATUS_INFO,
                        "loading kernel");
        boot_task.local_image = load_url(NULL, image, &clean_image);
        update_status(status_fn, status_arg, BOOT_STATUS_INFO,
                        "loading kernel");
        boot_task.local_image = load_url(NULL, image, &clean_image);
@@ -330,7 +333,6 @@ int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd,
                goto no_load;
        }
 
                goto no_load;
        }
 
-       boot_task.local_initrd = NULL;
        if (initrd) {
                update_status(status_fn, status_arg, BOOT_STATUS_INFO,
                                "loading initrd");
        if (initrd) {
                update_status(status_fn, status_arg, BOOT_STATUS_INFO,
                                "loading initrd");
@@ -342,7 +344,6 @@ int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd,
                }
        }
 
                }
        }
 
-       boot_task.local_dtb = NULL;
        if (dtb) {
                update_status(status_fn, status_arg, BOOT_STATUS_INFO,
                                "loading device tree");
        if (dtb) {
                update_status(status_fn, status_arg, BOOT_STATUS_INFO,
                                "loading device tree");