X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fgrub2%2Fscript.c;h=8a9d91dac987c36680283f8b9c95cfdf6ac15fb5;hp=ed81a202c01fd068717081f1e3de10d91540d976;hb=HEAD;hpb=c5cbcf4b6a2ee7dafba8d29d52071752f3022ebb diff --git a/discover/grub2/script.c b/discover/grub2/script.c index ed81a20..8a9d91d 100644 --- a/discover/grub2/script.c +++ b/discover/grub2/script.c @@ -103,7 +103,7 @@ static bool is_delim(char c) } static bool option_is_default(struct grub2_script *script, - struct discover_boot_option *opt, const char *id) + struct discover_boot_option *opt, const char *id) { unsigned int default_idx; const char *var; @@ -117,12 +117,10 @@ static bool option_is_default(struct grub2_script *script, if (end != var && *end == '\0') return default_idx == script->n_options; - /* if we don't have an explicit id for this option, fall back to - * the name */ - if (!id) - id = opt->option->name; + if (id && !strcmp(id, var)) + return true; - return !strcmp(id, var); + return !strcmp(opt->option->name, var); } static void append_text_to_current_arg(struct grub2_argv *argv, @@ -227,7 +225,7 @@ static void process_expansions(struct grub2_script *script, } /* we may have allocated an extra argv element but not populated it */ - if (!argv->argv[argv->argc - 1]) + if (argv->argv && !argv->argv[argv->argc - 1]) argv->argc--; } @@ -341,9 +339,16 @@ int statement_menuentry_execute(struct grub2_script *script, * implementation to get --id= working. */ for (i = 1; i < st->argv->argc; ++i) { - if (strncmp("--id=", st->argv->argv[i], 5) == 0) { - id = st->argv->argv[i] + 5; - break; + if (strncmp("--id", st->argv->argv[i], strlen("--id")) == 0) { + if (strlen(st->argv->argv[i]) > strlen("--id=")) { + id = st->argv->argv[i] + strlen("--id="); + break; + } + + if (i + 1 < st->argv->argc) { + id = st->argv->argv[i + 1]; + break; + } } } if (st->argv->argc > 0) @@ -489,6 +494,9 @@ void script_execute(struct grub2_script *script) { struct discover_boot_option *opt, *tmp; + if (!script) + return; + init_env(script); statements_execute(script, script->statements);