From bae09d0d47418def5585a22a0a8af50ebfae327a Mon Sep 17 00:00:00 2001 From: BVK Chaitanya Date: Sat, 23 Jan 2010 00:42:55 +0530 Subject: [PATCH] remove arbitrary limit on menuentry recording --- include/grub/script_sh.h | 4 ++-- script/lexer.c | 15 +++++++++------ script/yylex.l | 6 ++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/include/grub/script_sh.h b/include/grub/script_sh.h index 1eb6d0bb8..5ada7c7e5 100644 --- a/include/grub/script_sh.h +++ b/include/grub/script_sh.h @@ -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 diff --git a/script/lexer.c b/script/lexer.c index 179e1d1d2..834ca1e91 100644 --- a/script/lexer.c +++ b/script/lexer.c @@ -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; } diff --git a/script/yylex.l b/script/yylex.l index c19461c9a..9cafba5c2 100644 --- a/script/yylex.l +++ b/script/yylex.l @@ -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) {