Fix a segfault / internal compiler error.

Among other causes, when gcc throws a warning before parsing any tokens,
the cur_token pointer is at the beginning of malloc'd memory.
Dereferencing cur_token[-1] can cause a segfault.

Code taken from OpenBSD
http://www.openbsd.org/cgi-bin/cvsweb/src/gnu/gcc/libcpp/errors.c
which was a more complete fix than the one I originally coded.

MFC after:	1 week
This commit is contained in:
Matthew D Fleming 2013-11-26 17:11:43 +00:00
parent da162ca88f
commit 9b76499a0b

View File

@ -153,7 +153,20 @@ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
}
else
{
src_loc = pfile->cur_token[-1].src_loc;
/* Find actual previous token. */
cpp_token *t;
if (pfile->cur_token != pfile->cur_run->base)
t = pfile->cur_token - 1;
else
{
if (pfile->cur_run->prev != NULL)
t = pfile->cur_run->prev->limit;
else
t = NULL;
}
/* Retrieve corresponding source location, unless we failed. */
src_loc = t ? t->src_loc : 0;
}
if (_cpp_begin_message (pfile, level, src_loc, 0))