From 92f7bf73b05bc6806eb84dd95bcbffb4621025b1 Mon Sep 17 00:00:00 2001 From: mdf Date: Thu, 12 Dec 2013 02:03:42 +0000 Subject: [PATCH] MFC r258658: 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. git-svn-id: svn://svn.freebsd.org/base/stable/10@259242 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- contrib/gcclibs/libcpp/errors.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/contrib/gcclibs/libcpp/errors.c b/contrib/gcclibs/libcpp/errors.c index 97de49000..c8efd5387 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)) -- 2.45.0