aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2011-06-23 00:33:28 -0700
committerPaul Eggert2011-06-23 00:33:28 -0700
commitff5844ad0bc84ea05e1f57827a040a31f54b8a9c (patch)
tree3a3f031629dc86b70285d434b5e27a5ec9f64ff4 /src
parent90532f02fdde568772852dc53be37d36855ef391 (diff)
downloademacs-ff5844ad0bc84ea05e1f57827a040a31f54b8a9c.tar.gz
emacs-ff5844ad0bc84ea05e1f57827a040a31f54b8a9c.zip
* print.c (printchar, strout): Check for string overflow.
(PRINTPREPARE, printchar, strout): Don't set size unless allocation succeeds.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog4
-rw-r--r--src/print.c28
2 files changed, 23 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 1be34fdbfe2..7948766690f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
12011-06-23 Paul Eggert <eggert@cs.ucla.edu> 12011-06-23 Paul Eggert <eggert@cs.ucla.edu>
2 2
3 * print.c (printchar, strout): Check for string overflow.
4 (PRINTPREPARE, printchar, strout):
5 Don't set size unless allocation succeeds.
6
3 * minibuf.c (read_minibuf_noninteractive): Use ptrdiff_t, not int, 7 * minibuf.c (read_minibuf_noninteractive): Use ptrdiff_t, not int,
4 for sizes. Check for string overflow more accurately. 8 for sizes. Check for string overflow more accurately.
5 Simplify newline removal at end; this suppresses a GCC 4.6.0 warning. 9 Simplify newline removal at end; this suppresses a GCC 4.6.0 warning.
diff --git a/src/print.c b/src/print.c
index d07f89702cc..009bea34f65 100644
--- a/src/print.c
+++ b/src/print.c
@@ -159,8 +159,9 @@ int print_output_debug_flag EXTERNALLY_VISIBLE = 1;
159 } \ 159 } \
160 else \ 160 else \
161 { \ 161 { \
162 print_buffer_size = 1000; \ 162 ptrdiff_t new_size = 1000; \
163 print_buffer = (char *) xmalloc (print_buffer_size); \ 163 print_buffer = (char *) xmalloc (new_size); \
164 print_buffer_size = new_size; \
164 free_print_buffer = 1; \ 165 free_print_buffer = 1; \
165 } \ 166 } \
166 print_buffer_pos = 0; \ 167 print_buffer_pos = 0; \
@@ -235,9 +236,15 @@ printchar (unsigned int ch, Lisp_Object fun)
235 236
236 if (NILP (fun)) 237 if (NILP (fun))
237 { 238 {
238 if (print_buffer_pos_byte + len >= print_buffer_size) 239 if (print_buffer_size - len <= print_buffer_pos_byte)
239 print_buffer = (char *) xrealloc (print_buffer, 240 {
240 print_buffer_size *= 2); 241 ptrdiff_t new_size;
242 if (STRING_BYTES_BOUND / 2 < print_buffer_size)
243 string_overflow ();
244 new_size = print_buffer_size * 2;
245 print_buffer = (char *) xrealloc (print_buffer, new_size);
246 print_buffer_size = new_size;
247 }
241 memcpy (print_buffer + print_buffer_pos_byte, str, len); 248 memcpy (print_buffer + print_buffer_pos_byte, str, len);
242 print_buffer_pos += 1; 249 print_buffer_pos += 1;
243 print_buffer_pos_byte += len; 250 print_buffer_pos_byte += len;
@@ -280,11 +287,14 @@ strout (const char *ptr, EMACS_INT size, EMACS_INT size_byte,
280 287
281 if (NILP (printcharfun)) 288 if (NILP (printcharfun))
282 { 289 {
283 if (print_buffer_pos_byte + size_byte > print_buffer_size) 290 if (print_buffer_size - size_byte < print_buffer_pos_byte)
284 { 291 {
285 print_buffer_size = print_buffer_size * 2 + size_byte; 292 ptrdiff_t new_size;
286 print_buffer = (char *) xrealloc (print_buffer, 293 if (STRING_BYTES_BOUND / 2 - size_byte < print_buffer_size)
287 print_buffer_size); 294 string_overflow ();
295 new_size = print_buffer_size * 2 + size_byte;
296 print_buffer = (char *) xrealloc (print_buffer, new_size);
297 print_buffer_size = new_size;
288 } 298 }
289 memcpy (print_buffer + print_buffer_pos_byte, ptr, size_byte); 299 memcpy (print_buffer + print_buffer_pos_byte, ptr, size_byte);
290 print_buffer_pos += size; 300 print_buffer_pos += size;