diff options
| author | Paul Eggert | 2011-06-23 00:33:28 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-06-23 00:33:28 -0700 |
| commit | ff5844ad0bc84ea05e1f57827a040a31f54b8a9c (patch) | |
| tree | 3a3f031629dc86b70285d434b5e27a5ec9f64ff4 /src | |
| parent | 90532f02fdde568772852dc53be37d36855ef391 (diff) | |
| download | emacs-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/ChangeLog | 4 | ||||
| -rw-r--r-- | src/print.c | 28 |
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 @@ | |||
| 1 | 2011-06-23 Paul Eggert <eggert@cs.ucla.edu> | 1 | 2011-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; |