discover/grub2: Fix handling of positional parameters
authorAlan Dunn <amdunn@google.com>
Wed, 2 Mar 2016 16:59:02 +0000 (08:59 -0800)
committerSam Mendoza-Jonas <sam@mendozajonas.com>
Tue, 15 Mar 2016 03:10:22 +0000 (14:10 +1100)
Positional parameters are set in the environment with '$' prepended to
the name.  This causes lookups to fail because parameter lookups don't
include the '$'.

TESTED:
 Added a test that covers positional parameters in GRUB2 parser.
 Build succeeds, tests pass.

Bootstrapped-by: Nancy Yuen <yuenn@google.com>
Signed-off-by: Alan Dunn <amdunn@google.com>
Signed-off-by: Sam Mendoza-Jonas <sam@mendozajonas.com>
discover/grub2/script.c
test/parser/Makefile.am
test/parser/test-grub2-pos-param.c [new file with mode: 0644]

index f52168157cfb03aa3e3eb49e5ff3fd00039e66f2..48c963e7549c1982d45d1143895be4f301132e55 100644 (file)
@@ -380,7 +380,7 @@ static int function_invoke(struct grub2_script *script,
 
        /* set positional parameters */
        for (i = 0; i < argc; i++) {
-               name = talloc_asprintf(script, "$%d", i);
+               name = talloc_asprintf(script, "%d", i);
                script_env_set(script, name, argv[i]);
        }
 
index e4f9b9cfbc466d7e1c9bb02cf2bfa8f6ffefe357..9a6be6d1614e02508b6e87cfe3e5a5b4b06b734b 100644 (file)
@@ -26,6 +26,7 @@ parser_TESTS = \
        test/parser/test-grub2-multiple-resolve \
        test/parser/test-grub2-multiple-id \
        test/parser/test-grub2-single-line-if \
+       test/parser/test-grub2-pos-param \
        test/parser/test-grub2-load-env \
        test/parser/test-grub2-save-env \
        test/parser/test-grub2-save-env-dash-f \
diff --git a/test/parser/test-grub2-pos-param.c b/test/parser/test-grub2-pos-param.c
new file mode 100644 (file)
index 0000000..09ac8fc
--- /dev/null
@@ -0,0 +1,35 @@
+
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+
+function set_params_var {
+       params="$1 $2"
+}
+menuentry 'Linux' {
+       set_params_var abc 123
+       linux   test_kernel $params
+}
+
+#endif
+
+void run_test(struct parser_test *test)
+{
+       struct discover_boot_option *opt;
+       struct discover_context *ctx;
+
+       test_read_conf_embedded(test, "/boot/grub/grub.cfg");
+
+       test_run_parser(test, "grub2");
+
+       ctx = test->ctx;
+
+       check_boot_option_count(ctx, 1);
+       opt = get_boot_option(ctx, 0);
+
+       check_name(opt, "Linux");
+       /* The linux command, $params is expected to have been set when
+        * set_params was called in menuentry.
+        */
+       check_args(opt, "abc 123");
+}