]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
restrict to only one block-arg (as last) param per command
authorBVK Chaitanya <bvk.groups@gmail.com>
Tue, 20 Jul 2010 22:17:30 +0000 (03:47 +0530)
committerBVK Chaitanya <bvk.groups@gmail.com>
Tue, 20 Jul 2010 22:17:30 +0000 (03:47 +0530)
commands/extcmd.c
include/grub/extcmd.h
include/grub/script_sh.h
normal/dyncmd.c
script/argv.c
script/execute.c
script/parser.y
script/script.c

index 349e9bfc7066b08fba9cb69490133a0a449f252a..cc0362e14bb7f77c846b8da1d1c57f3be5403a71 100644 (file)
@@ -25,7 +25,7 @@
 
 grub_err_t
 grub_extcmd_dispatcher (struct grub_command *cmd, int argc, char **args,
-                       struct grub_script **scripts)
+                       struct grub_script *script)
 {
   int new_argc;
   char **new_args;
@@ -38,7 +38,7 @@ grub_extcmd_dispatcher (struct grub_command *cmd, int argc, char **args,
 
   context.state = 0;
   context.extcmd = ext;
-  context.script_params = scripts;
+  context.script = script;
 
   /* Dynamic commands should not perform option parsing before
      corresponding module gets loaded.  */
index a5e4d18fe3d42d19fbfd8a1785452703a097768b..773e47854e25a69b63f3e68973d8cd4780727475 100644 (file)
@@ -50,8 +50,8 @@ struct grub_extcmd_context
 
   struct grub_arg_list *state;
 
-  /* Script parameters, if any.  */
-  struct grub_script **script_params;
+  /* Script parameter, if any.  */
+  struct grub_script *script;
 };
 typedef struct grub_extcmd_context *grub_extcmd_context_t;
 
@@ -74,6 +74,6 @@ void grub_unregister_extcmd (grub_extcmd_t cmd);
 
 grub_err_t
 grub_extcmd_dispatcher (struct grub_command *cmd, int argc, char **args,
-                       struct grub_script **scripts);
+                       struct grub_script *script);
 
 #endif /* ! GRUB_EXTCMD_HEADER */
index 6471c7de3ea2e2de2feea86bd2c5ff6df020ca5d..43791d0406e5a8d8de2be902d963d345f495fede 100644 (file)
@@ -62,7 +62,7 @@ struct grub_script_arg
   char *str;
 
   /* Parsed block argument.  */
-  struct grub_script *block;
+  struct grub_script *script;
 
   /* Next argument part.  */
   struct grub_script_arg *next;
@@ -73,7 +73,7 @@ struct grub_script_argv
 {
   unsigned argc;
   char **args;
-  struct grub_script **scripts;
+  struct grub_script *script;
 };
 
 /* A complete argument.  It consists of a list of one or more `struct
@@ -234,8 +234,6 @@ void grub_script_argv_free    (struct grub_script_argv *argv);
 int grub_script_argv_next     (struct grub_script_argv *argv);
 int grub_script_argv_append   (struct grub_script_argv *argv, const char *s);
 int grub_script_argv_split_append (struct grub_script_argv *argv, char *s);
-int grub_script_argv_script_append (struct grub_script_argv *argv,
-                                   struct grub_script *s);
 
 struct grub_script_arglist *
 grub_script_create_arglist (struct grub_parser_param *state);
index 172baa44edd3ecc4eaf46bff34f7c49e1032383f..ed98855eb18b885dc0e3f32befc8a1c885553ac8 100644 (file)
@@ -54,8 +54,7 @@ grub_dyncmd_dispatcher (struct grub_extcmd_context *ctxt,
        {
          if (cmd->flags & GRUB_COMMAND_FLAG_BLOCKS &&
              cmd->flags & GRUB_COMMAND_FLAG_EXTCMD)
-           ret = grub_extcmd_dispatcher (cmd, argc, args,
-                                         ctxt->script_params);
+           ret = grub_extcmd_dispatcher (cmd, argc, args, ctxt->script);
          else
            ret = (cmd->func) (cmd, argc, args);
        }
index 8dd56334582048b209bfbd6c305dbb46687b40f8..42d573a0a047cfc99f587e19572c1f0bc08a0d4a 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include <grub/mm.h>
+#include <grub/misc.h>
 #include <grub/script_sh.h>
 
 static unsigned
@@ -52,18 +53,8 @@ grub_script_argv_free (struct grub_script_argv *argv)
       grub_free (argv->args);
     }
 
-  if (argv->scripts)
-    {
-      for (i = 0; i < argv->argc; i++)
-       if (argv->scripts[i])
-         grub_script_put (argv->scripts[i]);
-
-      grub_free (argv->scripts);
-    }
-
   argv->argc = 0;
   argv->args = 0;
-  argv->scripts = 0;
 }
 
 /* Prepare for next argc.  */
@@ -71,7 +62,6 @@ int
 grub_script_argv_next (struct grub_script_argv *argv)
 {
   char **p = argv->args;
-  struct grub_script **q = argv->scripts;
 
   if (argv->args && argv->argc && argv->args[argv->argc - 1] == 0)
     return 0;
@@ -80,24 +70,12 @@ grub_script_argv_next (struct grub_script_argv *argv)
   if (! p)
     return 1;
 
-  q = grub_realloc (q, round_up_exp ((argv->argc + 2) * sizeof (struct grub_script *)));
-  if (! q)
-    {
-      grub_free (p);
-      return 1;
-    }
-
   argv->argc++;
   argv->args = p;
-  argv->scripts = q;
 
   if (argv->argc == 1)
-    {
-      argv->args[0] = 0;
-      argv->scripts[0] = 0;
-    }
+    argv->args[0] = 0;
   argv->args[argv->argc] = 0;
-  argv->scripts[argv->argc] = 0;
   return 0;
 }
 
@@ -123,18 +101,6 @@ grub_script_argv_append (struct grub_script_argv *argv, const char *s)
   return 0;
 }
 
-/* Append grub_script `s' as the last argument.  */
-int
-grub_script_argv_script_append (struct grub_script_argv *argv,
-                               struct grub_script *script)
-{
-  if (argv->scripts[argv->argc - 1])
-    grub_script_put (argv->scripts[argv->argc - 1]);
-
-  argv->scripts[argv->argc - 1] = grub_script_get (script);
-  return 0;
-}
-
 /* Split `s' and append words as multiple arguments.  */
 int
 grub_script_argv_split_append (struct grub_script_argv *argv, char *s)
index 1e9cd00b7a7c8987466f03fc176327e02487ce52..932be6635a2e352db9a014c7bafe19ae2ca7fe29 100644 (file)
@@ -199,9 +199,9 @@ grub_script_arglist_to_argv (struct grub_script_arglist *arglist,
            case GRUB_SCRIPT_ARG_TYPE_BLOCK:
              if (grub_script_argv_append (&result, "{") ||
                  grub_script_argv_append (&result, arg->str) ||
-                 grub_script_argv_append (&result, "}") ||
-                 grub_script_argv_script_append (&result, arg->block))
+                 grub_script_argv_append (&result, "}"))
                goto fail;
+             result.script = arg->script;
              break;
 
            case GRUB_SCRIPT_ARG_TYPE_TEXT:
@@ -326,7 +326,7 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
       if ((grubcmd->flags & GRUB_COMMAND_FLAG_BLOCKS) &&
          (grubcmd->flags & GRUB_COMMAND_FLAG_EXTCMD))
        ret = grub_extcmd_dispatcher (grubcmd, argv.argc - 1, argv.args + 1,
-                                     argv.scripts + 1);
+                                     argv.script);
       else
        ret = (grubcmd->func) (grubcmd, argv.argc - 1, argv.args + 1);
     }
index eea7ba1115f5f1c445a823fb568d19eff3def779..76dc3fbca7d8967647c9d1c5bdaacdebbfefe85a 100644 (file)
@@ -79,7 +79,8 @@
 %token <arg> GRUB_PARSER_TOKEN_NAME      "name"
 %token <arg> GRUB_PARSER_TOKEN_WORD      "word"
 
-%type <arglist> word argument block parameters0 parameters1 arguments0 arguments1
+%type <arg> block block0
+%type <arglist> word argument parameters0 parameters1 arguments0 arguments1
 
 %type <cmd> script_init script
 %type <cmd> grubcmd ifclause ifcmd forcmd whilecmd untilcmd
@@ -160,21 +161,22 @@ block: "{"
        commands1 delimiters0 "}"
        {
          char *p;
-         struct grub_script_arg *arg;
         struct grub_script_mem *memory;
 
         memory = grub_script_mem_record_stop (state, $<memory>2);
          if ((p = grub_script_lexer_record_stop (state, $<offset>2)))
           *grub_strrchr (p, '}') = '\0';
 
-        arg = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p);
-        if (! arg || ! (arg->block = grub_script_create ($3, memory)))
+        $$ = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p);
+        if (! $$ || ! ($$->script = grub_script_create ($3, memory)))
           grub_script_mem_free (memory);
 
-         $$ = grub_script_add_arglist (state, 0, arg);
          grub_script_lexer_deref (state->lexerstate);
        }
 ;
+block0: /* Empty */ { $$ = 0; }
+      | block { $$ = $1; }
+;
 
 arguments0: /* Empty */ { $$ = 0; }
           | arguments1  { $$ = $1; }
@@ -201,27 +203,22 @@ parameters1: argument parameters0
                  }
                $$ = $1;
              }
-           | block parameters0
-             {
-               if ($1 && $2)
-                 {
-                   $1->next = $2;
-                   $1->argcount += $2->argcount;
-                   $2->argcount = 0;
-                 }
-               $$ = $1;
-             }
 ;
 parameters0: /* Empty */ { $$ = 0; }
            | parameters1 { $$ = $1; }
 ;
 
-grubcmd: word parameters0
+grubcmd: word parameters0 block0
          {
-           if ($1 && $2) {
-             $1->next = $2;
-             $1->argcount += $2->argcount;
-             $2->argcount = 0;
+          struct grub_script_arglist *x = $2;
+
+          if ($3)
+            x = grub_script_add_arglist (state, $2, $3);
+
+           if ($1 && x) {
+             $1->next = x;
+             $1->argcount += x->argcount;
+             x->argcount = 0;
            }
            $$ = grub_script_create_cmdline (state, $1);
          }
index b7cbdff1daa4646570078f3ac728a22c49b6119c..7cf2f6baec106528d8ce02c0467d2092b58eccf4 100644 (file)
@@ -122,7 +122,7 @@ grub_script_arg_add (struct grub_parser_param *state,
     return arg;
 
   argpart->type = type;
-  argpart->block = 0;
+  argpart->script = 0;
 
   len = grub_strlen (str) + 1;
   argpart->str = grub_script_malloc (state, len);