diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2015-11-08 22:47:01 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2015-11-08 22:48:28 -0800 |
commit | 1087305574fd61256d66eb0c995f8bb74bd91afe (patch) | |
tree | 9f0052e41a56c785575727931ff4abb8e7dfa7e0 /src/coding.c | |
parent | bcca6a2a028d05af3cb5b31a5a2c997f3f1f1d31 (diff) | |
download | emacs-1087305574fd61256d66eb0c995f8bb74bd91afe.tar.gz |
Use INT_ADD_WRAPV etc. to check integer overflow
* src/alloc.c (xnmalloc, xnrealloc, xpalloc, Fmake_string):
* src/buffer.c (record_overlay_string, overlay_strings):
* src/casefiddle.c (casify_object):
* src/ccl.c (Fccl_execute_on_string):
* src/character.c (char_width, c_string_width, lisp_string_width)
(count_size_as_multibyte, string_escape_byte8):
* src/coding.c (coding_alloc_by_realloc, produce_chars):
* src/data.c (arith_driver):
* src/dispnew.c (realloc_glyph_pool, init_display):
* src/editfns.c (styled_format):
* src/fns.c (Ffillarray):
* src/ftfont.c (ftfont_shape_by_flt):
* src/gnutls.c (gnutls_hex_string):
* src/gtkutil.c (get_utf8_string):
* src/image.c (x_to_xcolors, x_detect_edges, png_load_body):
* src/keymap.c (Fkey_description):
* src/lisp.h (SAFE_ALLOCA_LISP):
* src/term.c (encode_terminal_code):
* src/tparam.c (tparam1):
* src/xselect.c (x_property_data_to_lisp):
* src/xsmfns.c (smc_save_yourself_CB):
* src/xterm.c (x_term_init):
When checking for integer overflow, prefer INT_MULTIPLY_WRAPV to
more-complicated code involving division and/or
INT_MULTIPLY_OVERFLOW, and similarly for INT_ADD_WRAPV and
subtraction and/or INT_ADD_OVERFLOW.
* src/casefiddle.c (casify_object): Simplify multibyte size check.
* src/character.c: Remove some obsolete ‘#ifdef emacs’s.
* src/data.c (arith_driver): Also check for division overflow,
as that’s now possible given that the accumulator can now contain
any Emacs integer.
* src/lisp.h (lisp_word_count): Remove; no longer used.
Diffstat (limited to 'src/coding.c')
-rw-r--r-- | src/coding.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/src/coding.c b/src/coding.c index 0b42a36543c..85b97ce6174 100644 --- a/src/coding.c +++ b/src/coding.c @@ -1008,11 +1008,12 @@ coding_change_destination (struct coding_system *coding) static void coding_alloc_by_realloc (struct coding_system *coding, ptrdiff_t bytes) { - if (STRING_BYTES_BOUND - coding->dst_bytes < bytes) + ptrdiff_t newbytes; + if (INT_ADD_WRAPV (coding->dst_bytes, bytes, &newbytes) + || SIZE_MAX < newbytes) string_overflow (); - coding->destination = xrealloc (coding->destination, - coding->dst_bytes + bytes); - coding->dst_bytes += bytes; + coding->destination = xrealloc (coding->destination, newbytes); + coding->dst_bytes = newbytes; } static void @@ -7048,14 +7049,12 @@ produce_chars (struct coding_system *coding, Lisp_Object translation_table, if ((dst_end - dst) / MAX_MULTIBYTE_LENGTH < to_nchars) { eassert (growable_destination (coding)); - if (((min (PTRDIFF_MAX, SIZE_MAX) - (buf_end - buf)) - / MAX_MULTIBYTE_LENGTH) - < to_nchars) + ptrdiff_t dst_size; + if (INT_MULTIPLY_WRAPV (to_nchars, MAX_MULTIBYTE_LENGTH, + &dst_size) + || INT_ADD_WRAPV (buf_end - buf, dst_size, &dst_size)) memory_full (SIZE_MAX); - dst = alloc_destination (coding, - buf_end - buf - + MAX_MULTIBYTE_LENGTH * to_nchars, - dst); + dst = alloc_destination (coding, dst_size, dst); if (EQ (coding->src_object, coding->dst_object)) { coding_set_source (coding); |