parser/yaboot: Fix check for image presence
authorJeremy Kerr <jk@ozlabs.org>
Wed, 31 Jul 2013 00:44:11 +0000 (08:44 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 31 Jul 2013 00:46:54 +0000 (08:46 +0800)
In the cleanup of yaboot option state, 3fb8fb6fb, we change from
checking opt->boot_image to opt, to indicate that we're parsing an image
section.

We missed one check, which is causing a segfault due to the null opt.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/yaboot-parser.c
test/parser/Makefile.am
test/parser/test-yaboot-root-global.c [new file with mode: 0644]

index 3696abff9d7c6e9489bbce490a578b25416647ae..39fba63055b12f08332e88ddfc30e899306d8050 100644 (file)
@@ -175,7 +175,8 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name,
                return;
        }
 
-       if (!opt->boot_image) {
+       /* all other processing requires an image */
+       if (!opt) {
                pb_log("%s: unknown name: %s\n", __func__, name);
                return;
        }
index f1458cd279728f2ba45cd8ca6c1b53c99b86a579..bb45a40f7939ea20d6b9ede35242eeb75eb425d9 100644 (file)
@@ -34,6 +34,7 @@ TESTS = \
        test-kboot-single \
        test-yaboot-single \
        test-yaboot-external \
+       test-yaboot-root-global \
        test-yaboot-rh8-ppc64 \
        test-pxe-single \
        test-pxe-initrd-in-append
diff --git a/test/parser/test-yaboot-root-global.c b/test/parser/test-yaboot-root-global.c
new file mode 100644 (file)
index 0000000..6d8da85
--- /dev/null
@@ -0,0 +1,31 @@
+
+
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+default=linux
+root=/dev/sda1
+
+image=/vmlinux
+       label=linux
+       initrd=/initrd
+#endif
+
+void run_test(struct parser_test *test)
+{
+       struct discover_boot_option *opt;
+       struct discover_context *ctx;
+
+       test_read_conf_embedded(test);
+       test_run_parser(test, "yaboot");
+
+       ctx = test->ctx;
+
+       check_boot_option_count(ctx, 1);
+
+       opt = get_boot_option(ctx, 0);
+
+       check_name(opt, "linux");
+       check_resolved_local_resource(opt->boot_image, ctx->device, "/vmlinux");
+       check_resolved_local_resource(opt->initrd, ctx->device, "/initrd");
+}