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:
parent
da162ca88f
commit
9b76499a0b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=258658
@ -153,7 +153,20 @@ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
|
|||||||
}
|
}
|
||||||
else
|
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))
|
if (_cpp_begin_message (pfile, level, src_loc, 0))
|
||||||
|
Loading…
Reference in New Issue
Block a user