aboutsummaryrefslogtreecommitdiff
path: root/libcpp/charset.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-12-03 18:19:47 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-12-03 18:19:47 +0100
commitf41e5bd19ddc48d291b01a270623c379568d325d (patch)
tree0631b731076c534491f883f189109e95a9bd12d4 /libcpp/charset.c
parent36402bb1864531f22acc9c3ef2403e1d3cddfc65 (diff)
downloadgcc-f41e5bd19ddc48d291b01a270623c379568d325d.zip
gcc-f41e5bd19ddc48d291b01a270623c379568d325d.tar.gz
gcc-f41e5bd19ddc48d291b01a270623c379568d325d.tar.bz2
re PR bootstrap/55380 (All search_line_fast implementations read beyond buffer)
PR bootstrap/55380 PR other/54691 * files.c (read_file_guts): Allocate extra 16 bytes instead of 1 byte at the end of buf. Pass size + 16 instead of size to _cpp_convert_input. * charset.c (_cpp_convert_input): Reallocate if there aren't at least 16 bytes beyond to.len in the buffer. Clear 16 bytes at to.text + to.len. From-SVN: r194102
Diffstat (limited to 'libcpp/charset.c')
-rw-r--r--libcpp/charset.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/libcpp/charset.c b/libcpp/charset.c
index cba19a6..09e2b7b 100644
--- a/libcpp/charset.c
+++ b/libcpp/charset.c
@@ -1,6 +1,6 @@
/* CPP Library - charsets
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009,
- 2010 Free Software Foundation, Inc.
+ 2010, 2012 Free Software Foundation, Inc.
Broken out of c-lex.c Apr 2003, adding valid C99 UCN ranges.
@@ -1729,9 +1729,15 @@ _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
iconv_close (input_cset.cd);
/* Resize buffer if we allocated substantially too much, or if we
- haven't enough space for the \n-terminator. */
- if (to.len + 4096 < to.asize || to.len >= to.asize)
- to.text = XRESIZEVEC (uchar, to.text, to.len + 1);
+ haven't enough space for the \n-terminator or following
+ 15 bytes of padding (used to quiet warnings from valgrind or
+ Address Sanitizer, when the optimized lexer accesses aligned
+ 16-byte memory chunks, including the bytes after the malloced,
+ area, and stops lexing on '\n'). */
+ if (to.len + 4096 < to.asize || to.len + 16 > to.asize)
+ to.text = XRESIZEVEC (uchar, to.text, to.len + 16);
+
+ memset (to.text + to.len, '\0', 16);
/* If the file is using old-school Mac line endings (\r only),
terminate with another \r, not an \n, so that we do not mistake