From fd2df2ede47e0254d528ffb890a6d5b9b1dbb3a6 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 6 Jul 2005 04:12:23 +0000 Subject: [PATCH] * data/glr.c (yyFail): Drastically simplify; since the format argument never had any % directives, we can simply pass it to yyerror. (yyparse): Use "t a; a=b;" rather than "t a = b;" when a will be modified later, as that is the usual style in glr.c. --- ChangeLog | 6 ++++++ data/glr.c | 36 ++++++------------------------------ 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index c3b7ab3f..0c4f8132 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2005-07-05 Paul Eggert + * data/glr.c (yyFail): Drastically simplify; since the format argument + never had any % directives, we can simply pass it to yyerror. + (yyparse): Use "t a; a=b;" rather than "t a = b;" when a will + be modified later, as that is the usual style in glr.c. + Problems reported by Paul Hilfinger. + Rewrite GLR parser to catch more buffer overrun, storage exhaustion, and size overflow errors. * data/glr.c: Include etc. after user prolog, not before, diff --git a/data/glr.c b/data/glr.c index 00b36bae..d39b5e0c 100644 --- a/data/glr.c +++ b/data/glr.c @@ -678,37 +678,11 @@ struct yyGLRStack { static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[); static void -yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yyformat, ...) +yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg) { yystack->yyerrflag = 1; - if (yyformat != NULL) - { - char yysmallbuf[1024]; - char const *yymsg = yysmallbuf; - char *yybigbuf = NULL; - int yymsglen; - va_list yyap; - - va_start (yyap, yyformat); - yymsglen = vsnprintf (yysmallbuf, sizeof yysmallbuf, yyformat, yyap); - va_end (yyap); - - if (yymsglen < 0) - yymsg = "message is too long to be printed"; - else if (sizeof yysmallbuf <= yymsglen && yymsglen < YYSIZEMAX) - { - size_t yybigsize = yymsglen; - yybigsize++; - yymsg = yybigbuf = YYMALLOC (yybigsize); - - va_start (yyap, yyformat); - vsnprintf (yybigbuf, yybigsize, yyformat, yyap); - va_end (yyap); - } - - yyerror (]b4_yyerror_args[yymsg); - YYFREE (yybigbuf); - } + if (yymsg != NULL) + yyerror (]b4_yyerror_args[yymsg); longjmp (yystack->yyexception_buffer, 1); } @@ -1973,7 +1947,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, ]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[ { - yySymbol yytoken = YYEMPTY; + yySymbol yytoken; yyGLRStack yystack; size_t yyposn; ]b4_pure_if( @@ -1989,6 +1963,8 @@ yyrecoverSyntaxError (yyGLRStack* yystack, YYDPRINTF ((stderr, "Starting parse\n")); + yytoken = YYEMPTY; + if (setjmp (yystack.yyexception_buffer) != 0) goto yyDone; -- 2.47.2