diff options
Diffstat (limited to 'src/insdel.c')
-rw-r--r-- | src/insdel.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/src/insdel.c b/src/insdel.c index c0cccc65d6a..bc95e3ad9e8 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -391,6 +391,12 @@ adjust_markers_for_replace (EMACS_INT from, EMACS_INT from_byte, } +void +buffer_overflow (void) +{ + error ("Maximum buffer size exceeded"); +} + /* Make the gap NBYTES_ADDED bytes longer. */ static void @@ -400,16 +406,16 @@ make_gap_larger (EMACS_INT nbytes_added) EMACS_INT real_gap_loc; EMACS_INT real_gap_loc_byte; EMACS_INT old_gap_size; + EMACS_INT current_size = Z_BYTE - BEG_BYTE + GAP_SIZE; + enum { enough_for_a_while = 2000 }; - /* If we have to get more space, get enough to last a while. */ - nbytes_added += 2000; + if (BUF_BYTES_MAX - current_size < nbytes_added) + buffer_overflow (); - { EMACS_INT total_size = Z_BYTE - BEG_BYTE + GAP_SIZE + nbytes_added; - if (total_size < 0 - /* Don't allow a buffer size that won't fit in a Lisp integer. */ - || total_size != XINT (make_number (total_size))) - error ("Buffer exceeds maximum size"); - } + /* If we have to get more space, get enough to last a while; + but do not exceed the maximum buffer size. */ + nbytes_added = min (nbytes_added + enough_for_a_while, + BUF_BYTES_MAX - current_size); enlarge_buffer_text (current_buffer, nbytes_added); @@ -1063,7 +1069,6 @@ static void insert_from_buffer_1 (struct buffer *buf, EMACS_INT from, EMACS_INT nchars, int inherit) { - register Lisp_Object temp; EMACS_INT chunk, chunk_expanded; EMACS_INT from_byte = buf_charpos_to_bytepos (buf, from); EMACS_INT to_byte = buf_charpos_to_bytepos (buf, from + nchars); @@ -1102,11 +1107,6 @@ insert_from_buffer_1 (struct buffer *buf, outgoing_nbytes = outgoing_before_gap + outgoing_after_gap; } - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, outgoing_nbytes + Z); - if (outgoing_nbytes + Z != XINT (temp)) - error ("Maximum buffer size exceeded"); - /* Do this before moving and increasing the gap, because the before-change hooks might move the gap or make it smaller. */ @@ -1303,7 +1303,6 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, EMACS_INT insbytes = SBYTES (new); EMACS_INT from_byte, to_byte; EMACS_INT nbytes_del, nchars_del; - register Lisp_Object temp; struct gcpro gcpro1; INTERVAL intervals; EMACS_INT outgoing_insbytes = insbytes; @@ -1347,11 +1346,6 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, outgoing_insbytes = count_size_as_multibyte (SDATA (new), insbytes); - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, Z_BYTE - nbytes_del + insbytes); - if (Z_BYTE - nbytes_del + insbytes != XINT (temp)) - error ("Maximum buffer size exceeded"); - GCPRO1 (new); /* Make sure the gap is somewhere in or next to what we are deleting. */ @@ -1383,8 +1377,8 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, if (Z - GPT < END_UNCHANGED) END_UNCHANGED = Z - GPT; - if (GAP_SIZE < insbytes) - make_gap (insbytes - GAP_SIZE); + if (GAP_SIZE < outgoing_insbytes) + make_gap (outgoing_insbytes - GAP_SIZE); /* Copy the string text into the buffer, perhaps converting between single-byte and multibyte. */ @@ -1482,7 +1476,6 @@ replace_range_2 (EMACS_INT from, EMACS_INT from_byte, int markers) { EMACS_INT nbytes_del, nchars_del; - Lisp_Object temp; CHECK_MARKERS (); @@ -1492,11 +1485,6 @@ replace_range_2 (EMACS_INT from, EMACS_INT from_byte, if (nbytes_del <= 0 && insbytes == 0) return; - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, Z_BYTE - nbytes_del + insbytes); - if (Z_BYTE - nbytes_del + insbytes != XINT (temp)) - error ("Maximum buffer size exceeded"); - /* Make sure the gap is somewhere in or next to what we are deleting. */ if (from > GPT) gap_right (from, from_byte); |