On Sun, Aug 23, 2009 at 3:20 PM, Robert Millan<r...@aybabtu.com> wrote:
> On Sat, Aug 22, 2009 at 04:30:08PM +0200, Vladimir 'phcoder' Serbinenko wrote:
>> Making GNU GRUB more GNU ;)
>
> Good!  But please could you use NULL for pointers?  :-)
>
> Also, remember to include a ChangeLog entry.
>
> --
> Robert Millan
>
>  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
>  how) you may access your data; but nobody's threatening your freedom: we
>  still allow you to remove your data and not access it at all."
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog
index 1efb882..6d9065e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2009-08-24  Vladimir Serbinenko  <phco...@gmail.com>
 
+       * script/sh/function.c (grub_script_function_find): Cut error message
+       not to flood terminal.
+       * script/sh/lexer.c (grub_script_yylex): Remove command line length
+       limit.
+       * script/sh/script.c (grub_script_arg_add): Duplicate string.
+
+2009-08-24  Vladimir Serbinenko  <phco...@gmail.com>
+
        Rename *_partition_map to part_*
 
        * partmap/acorn.c (grub_acorn_partition_map): Set name to 'part_acorn'.
diff --git a/script/sh/function.c b/script/sh/function.c
index 1e49c70..a3950a8 100644
--- a/script/sh/function.c
+++ b/script/sh/function.c
@@ -99,7 +99,7 @@ grub_script_function_find (char *functionname)
       break;
 
   if (! func)
-    grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%s'", 
functionname);
+    grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%.20s'", 
functionname);
 
   return func;
 }
diff --git a/script/sh/lexer.c b/script/sh/lexer.c
index 44d7da2..4e071dd 100644
--- a/script/sh/lexer.c
+++ b/script/sh/lexer.c
@@ -134,8 +134,6 @@ grub_script_yylex (union YYSTYPE *yylval, struct 
grub_parser_param *parsestate)
 {
   grub_parser_state_t newstate;
   char use;
-  char *buffer;
-  char *bp;
   struct grub_lexer_param *state = parsestate->lexerstate;
   int firstrun = 1;
 
@@ -212,6 +210,14 @@ grub_script_yylex (union YYSTYPE *yylval, struct 
grub_parser_param *parsestate)
       /* Check if it is a text.  */
       if (check_textstate (newstate))
        {
+         char *buffer = NULL;
+         int bufpos = 0;
+         /* Buffer is initially large enough to hold most commands
+            but extends automaticlly when needed.  */
+         int bufsize = 128;
+
+         buffer = grub_malloc (bufsize);
+
          /* In case the string is not quoted, this can be a one char
             length symbol.  */
          if (newstate == GRUB_PARSER_STATE_TEXT)
@@ -254,16 +260,12 @@ grub_script_yylex (union YYSTYPE *yylval, struct 
grub_parser_param *parsestate)
                  }
                }
              if (doexit)
-               break;
+               {
+                 grub_free (buffer);
+                 break;
+               }
            }
 
-         /* XXX: Use a better size.  */
-         buffer = grub_script_malloc (parsestate, 2048);
-         if (! buffer)
-           return 0;
-
-         bp = buffer;
-
          /* Read one token, possible quoted.  */
          while (*state->script)
            {
@@ -295,32 +297,47 @@ grub_script_yylex (union YYSTYPE *yylval, struct 
grub_parser_param *parsestate)
                    }
                  if (breakout)
                    break;
-                 if (use)
-                   *(bp++) = use;
                }
-             else if (use)
-               *(bp++) = use;
+
+             if (use)
+               {
+                 if (bufsize <= bufpos + 1)
+                   {
+                     bufsize <<= 1;
+                     buffer = grub_realloc (buffer, bufsize);
+                   }
+                 buffer[bufpos++] = use;
+               }
 
              state->state = newstate;
              nextchar (state);
            }
 
          /* A string of text was read in.  */
-         *bp = '\0';
+         if (bufsize <= bufpos + 1)
+           {
+             bufsize <<= 1;
+             buffer = grub_realloc (buffer, bufsize);
+           }
+
+         buffer[bufpos++] = 0;
+
          grub_dprintf ("scripting", "token=`%s'\n", buffer);
          yylval->arg = grub_script_arg_add (parsestate, yylval->arg,
                                             GRUB_SCRIPT_ARG_TYPE_STR, buffer);
 
+         grub_free (buffer);
        }
       else if (newstate == GRUB_PARSER_STATE_VAR
               || newstate == GRUB_PARSER_STATE_QVAR)
        {
-         /* XXX: Use a better size.  */
-         buffer = grub_script_malloc (parsestate, 2096);
-         if (! buffer)
-           return 0;
+         char *buffer = NULL;
+         int bufpos = 0;
+         /* Buffer is initially large enough to hold most commands
+            but extends automaticlly when needed.  */
+         int bufsize = 128;
 
-         bp = buffer;
+         buffer = grub_malloc (bufsize);
 
          /* This is a variable, read the variable name.  */
          while (*state->script)
@@ -340,16 +357,33 @@ grub_script_yylex (union YYSTYPE *yylval, struct 
grub_parser_param *parsestate)
                }
 
              if (use)
-               *(bp++) = use;
+               {
+                 if (bufsize <= bufpos + 1)
+                   {
+                     bufsize <<= 1;
+                     buffer = grub_realloc (buffer, bufsize);
+                   }
+                 buffer[bufpos++] = use;
+               }
+
              nextchar (state);
              state->state = newstate;
            }
 
-         *bp = '\0';
+         if (bufsize <= bufpos + 1)
+           {
+             bufsize <<= 1;
+             buffer = grub_realloc (buffer, bufsize);
+           }
+
+         buffer[bufpos++] = 0;
+
          state->state = newstate;
          yylval->arg = grub_script_arg_add (parsestate, yylval->arg,
                                             GRUB_SCRIPT_ARG_TYPE_VAR, buffer);
          grub_dprintf ("scripting", "vartoken=`%s'\n", buffer);
+
+         grub_free (buffer);
        }
       else
        {
diff --git a/script/sh/script.c b/script/sh/script.c
index cefafe6..c04a449 100644
--- a/script/sh/script.c
+++ b/script/sh/script.c
@@ -110,10 +110,13 @@ grub_script_arg_add (struct grub_parser_param *state, 
struct grub_script_arg *ar
 {
   struct grub_script_arg *argpart;
   struct grub_script_arg *ll;
+  int len;
 
   argpart = (struct grub_script_arg *) grub_script_malloc (state, sizeof 
(*arg));
   argpart->type = type;
-  argpart->str = str;
+  len = grub_strlen (str) + 1;
+  argpart->str = grub_script_malloc (state, len);
+  grub_memcpy (argpart->str, str, len);
   argpart->next = 0;
 
   if (! arg)
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to