re PR preprocessor/29966 (crash in cc1 with backtrace from free())

PR preprocessor/29966:
	* macro.c (lex_expansion_token): Save and restore cpp_reader's
	cur_token.
	(_cpp_create_definition): Don't restore cur_token here.
	* lex.c (_cpp_lex_token): Added assertion.

From-SVN: r121340
This commit is contained in:
Tom Tromey 2007-01-30 15:46:01 +00:00 committed by Tom Tromey
parent 9caea4a72f
commit ee380365ef
3 changed files with 19 additions and 9 deletions

View file

@ -1,3 +1,11 @@
2007-01-30 Tom Tromey <tromey@redhat.com>
PR preprocessor/29966:
* macro.c (lex_expansion_token): Save and restore cpp_reader's
cur_token.
(_cpp_create_definition): Don't restore cur_token here.
* lex.c (_cpp_lex_token): Added assertion.
2007-01-27 Tom Tromey <tromey@redhat.com>
* configure: Rebuilt.

View file

@ -766,6 +766,11 @@ _cpp_lex_token (cpp_reader *pfile)
pfile->cur_run = next_tokenrun (pfile->cur_run);
pfile->cur_token = pfile->cur_run->base;
}
/* We assume that the current token is somewhere in the current
run. */
if (pfile->cur_token < pfile->cur_run->base
|| pfile->cur_token >= pfile->cur_run->limit)
abort ();
if (pfile->lookaheads)
{

View file

@ -1,6 +1,7 @@
/* Part of CPP library. (Macro and #define handling.)
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Free Software Foundation, Inc.
Written by Per Bothner, 1994.
Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987
@ -1398,10 +1399,12 @@ alloc_expansion_token (cpp_reader *pfile, cpp_macro *macro)
static cpp_token *
lex_expansion_token (cpp_reader *pfile, cpp_macro *macro)
{
cpp_token *token;
cpp_token *token, *saved_cur_token;
saved_cur_token = pfile->cur_token;
pfile->cur_token = alloc_expansion_token (pfile, macro);
token = _cpp_lex_direct (pfile);
pfile->cur_token = saved_cur_token;
/* Is this a parameter? */
if (token->type == CPP_NAME
@ -1590,18 +1593,12 @@ _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
ok = _cpp_create_trad_definition (pfile, macro);
else
{
cpp_token *saved_cur_token = pfile->cur_token;
ok = create_iso_definition (pfile, macro);
/* Restore lexer position because of games lex_expansion_token()
plays lexing the macro. We set the type for SEEN_EOL() in
directives.c.
/* We set the type for SEEN_EOL() in directives.c.
Longer term we should lex the whole line before coming here,
and just copy the expansion. */
saved_cur_token[-1].type = pfile->cur_token[-1].type;
pfile->cur_token = saved_cur_token;
/* Stop the lexer accepting __VA_ARGS__. */
pfile->state.va_args_ok = 0;