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
This commit is contained in:
Jakub Jelinek 2012-12-03 18:19:47 +01:00 committed by Jakub Jelinek
parent 36402bb186
commit f41e5bd19d
3 changed files with 28 additions and 7 deletions

View file

@ -671,7 +671,11 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
the majority of C source files. */
size = 8 * 1024;
buf = XNEWVEC (uchar, size + 1);
/* The + 16 here is space for the final '\n' and 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'. */
buf = XNEWVEC (uchar, size + 16);
total = 0;
while ((count = read (file->fd, buf + total, size - total)) > 0)
{
@ -682,7 +686,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
if (regular)
break;
size *= 2;
buf = XRESIZEVEC (uchar, buf, size + 1);
buf = XRESIZEVEC (uchar, buf, size + 16);
}
}
@ -699,7 +703,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
file->buffer = _cpp_convert_input (pfile,
CPP_OPTION (pfile, input_charset),
buf, size, total,
buf, size + 16, total,
&file->buffer_start,
&file->st.st_size);
file->buffer_valid = true;