summaryrefslogtreecommitdiffstats
path: root/contrib/gcclibs
diff options
context:
space:
mode:
authormdf <mdf@FreeBSD.org>2013-11-26 17:11:43 +0000
committermdf <mdf@FreeBSD.org>2013-11-26 17:11:43 +0000
commit92e719523bed5744892506827837280aae723e8b (patch)
tree39a591f6aa1c4d6b1d7d6d72fde0823963e7c463 /contrib/gcclibs
parent10cc4e7eb80bd87d9681b537b6782aea74ec53e2 (diff)
downloadFreeBSD-src-92e719523bed5744892506827837280aae723e8b.zip
FreeBSD-src-92e719523bed5744892506827837280aae723e8b.tar.gz
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
Diffstat (limited to 'contrib/gcclibs')
-rw-r--r--contrib/gcclibs/libcpp/errors.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/contrib/gcclibs/libcpp/errors.c b/contrib/gcclibs/libcpp/errors.c
index 97de490..c8efd53 100644
--- a/contrib/gcclibs/libcpp/errors.c
+++ b/contrib/gcclibs/libcpp/errors.c
@@ -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))
OpenPOWER on IntegriCloud