]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
remove arbitrary limit on menuentry recording
authorBVK Chaitanya <bvk.groups@gmail.com>
Fri, 22 Jan 2010 19:12:55 +0000 (00:42 +0530)
committerBVK Chaitanya <bvk.groups@gmail.com>
Fri, 22 Jan 2010 19:12:55 +0000 (00:42 +0530)
include/grub/script_sh.h
script/lexer.c
script/yylex.l

index 1eb6d0bb81b9d18ba7678ededb2e6fcb68d5d756..5ada7c7e51d06523127fec50cbcbdcc23d2b0a3e 100644 (file)
@@ -172,8 +172,8 @@ struct grub_lexer_param
   void *buffer;
 };
 
-#define GRUB_LEXER_INITIAL_TEXT_SIZE 32
-#define GRUB_LEXER_RECORD_INCREMENT 256
+#define GRUB_LEXER_INITIAL_TEXT_SIZE   32
+#define GRUB_LEXER_INITIAL_RECORD_SIZE 256
 
 /* State of the parser as passes to the parser.  */
 struct grub_parser_param
index 179e1d1d2a43f024518695e03efabac7c0f676d0..834ca1e918a670e30e566322c396787ca265ec26 100644 (file)
@@ -45,12 +45,11 @@ grub_script_lexer_record_start (struct grub_parser_param *parser)
 
   lexer->record = 1;
   lexer->recordpos = 0;
-  if (lexer->recording)                /* reuse last record */
+  if (lexer->recording) /* reuse last record */
     return;
 
-  lexer->recordlen = GRUB_LEXER_RECORD_INCREMENT;
+  lexer->recordlen = GRUB_LEXER_INITIAL_RECORD_SIZE;
   lexer->recording = grub_malloc (lexer->recordlen);
-
   if (!lexer->recording)
     {
       grub_script_yyerror (parser, 0);
@@ -99,27 +98,31 @@ grub_script_lexer_record_stop (struct grub_parser_param *parser)
   return result;
 }
 
+#define MAX(a,b) ((a) < (b) ? (b) : (a))
 
 /* Record STR if input recording is enabled.  */
 void
 grub_script_lexer_record (struct grub_parser_param *parser, char *str)
 {
   int len;
+  char *old;
   struct grub_lexer_param *lexer = parser->lexerstate;
 
   if (!lexer->record)
     return;
 
   len = grub_strlen (str);
-  if (lexer->recordpos + len >= lexer->recordlen - 1)
+  if (lexer->recordpos + len + 1 > lexer->recordlen)
     {
-      char *old = lexer->recording;
-      lexer->recordlen += GRUB_LEXER_RECORD_INCREMENT;
+      old = lexer->recording;
+      lexer->recordlen = MAX (len, lexer->recordlen) * 2;
       lexer->recording = grub_realloc (lexer->recording, lexer->recordlen);
       if (!lexer->recording)
        {
          grub_free (old);
          lexer->record = 0;
+         lexer->recordpos = 0;
+         lexer->recordlen /= 2;
          grub_script_yyerror (parser, 0);
          return;
        }
index c19461c9a63d0a623af6b8a9a350309c36205b1a..9cafba5c29f31b3e848438ad898cca2f0ddb2c23 100644 (file)
@@ -315,16 +315,18 @@ grub_lexer_yyrealloc (void *ptr, yy_size_t size,
   return grub_realloc (ptr, size);
 }
 
+#define MAX(a,b) ((a) < (b) ? (b) : (a))
+
 static void copy_string (struct grub_parser_param *parser, const char *str, unsigned hint)
 {
-  int len;
   int size;
   char *ptr;
+  unsigned len;
 
   len = hint ? hint : grub_strlen (str);
   if (parser->lexerstate->used + len >= parser->lexerstate->size)
     {
-      size = parser->lexerstate->size * 2;
+      size = MAX (len, parser->lexerstate->size) * 2;
       ptr = grub_realloc (parser->lexerstate->text, size);
       if (!ptr)
         {