aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorPaul Eggert2014-09-07 00:04:01 -0700
committerPaul Eggert2014-09-07 00:04:01 -0700
commitb3bf18b3b87ac8f00857b8bfc3f2c74cf0e2fb7d (patch)
treecf138164e4f8887394f52cb22da594d1713da316 /src/buffer.c
parent930fb80f9e2815e599eb1de699668d42e305fa21 (diff)
downloademacs-b3bf18b3b87ac8f00857b8bfc3f2c74cf0e2fb7d.tar.gz
emacs-b3bf18b3b87ac8f00857b8bfc3f2c74cf0e2fb7d.zip
Use SAFE_ALLOCA etc. to avoid unbounded stack allocation.
This follows up on the recent thread in emacs-devel on alloca; see: http://lists.gnu.org/archive/html/emacs-devel/2014-09/msg00042.html This patch also cleans up alloca-related glitches noted while examining the code looking for unbounded alloca. * alloc.c (listn): * callproc.c (init_callproc): Rewrite to avoid need for alloca. * buffer.c (mouse_face_overlay_overlaps) (report_overlay_modification): * buffer.h (GET_OVERLAYS_AT): * coding.c (make_subsidiaries): * doc.c (Fsnarf_documentation): * editfns.c (Fuser_full_name): * fileio.c (Ffile_name_directory, Fexpand_file_name) (search_embedded_absfilename, Fsubstitute_in_file_name): * fns.c (Fmake_hash_table): * font.c (font_vconcat_entity_vectors, font_update_drivers): * fontset.c (fontset_pattern_regexp, Ffontset_info): * frame.c (Fmake_terminal_frame, x_set_frame_parameters) (xrdb_get_resource, x_get_resource_string): * ftfont.c (ftfont_get_charset, ftfont_check_otf, ftfont_drive_otf): * ftxfont.c (ftxfont_draw): * image.c (xbm_load, xpm_load, jpeg_load_body): * keyboard.c (echo_add_key, menu_bar_items, tool_bar_items): * keymap.c (Fdescribe_buffer_bindings, describe_map): * lread.c (openp): * menu.c (digest_single_submenu, find_and_call_menu_selection) (find_and_return_menu_selection): * print.c (PRINTFINISH): * process.c (Fformat_network_address): * scroll.c (do_scrolling, do_direct_scrolling, scrolling_1): * search.c (search_buffer, Fmatch_data, Fregexp_quote): * sound.c (wav_play, au_play): * syntax.c (skip_chars): * term.c (tty_menu_activate, tty_menu_show): * textprop.c (get_char_property_and_overlay): * window.c (Fset_window_configuration): * xdisp.c (safe__call, next_overlay_change, vmessage) (compute_overhangs_and_x, draw_glyphs, note_mouse_highlight): * xfaces.c (face_at_buffer_position): * xmenu.c (x_menu_show): Use SAFE_ALLOCA etc. instead of plain alloca, since the allocation size isn't bounded. * callint.c (Fcall_interactively): Redo memory_full check so that it can be done at compile-time on some platforms. * coding.c (MAX_LOOKUP_MAX): New constant. (get_translation_table): Use it. * callproc.c (call_process): Use SAFE_NALLOCA instead of SAFE_ALLOCA, to catch integer overflows on size calculation. (exec_failed) [!DOS_NT]: New function. (child_setup) [!DOS_NT]: Use it. * editfns.c (Ftranspose_regions): Hoist USE_SAFE_ALLOC + SAFE_FREE out of 'if'. * editfns.c (check_translation): Allocate larger buffers on the heap. * eval.c (internal_lisp_condition_case): Check for MAX_ALLOCA overflow. * fns.c (sort_vector): Use SAFE_ALLOCA_LISP rather than Fmake_vector. (Fbase64_encode_region, Fbase64_decode_region): Avoid unnecessary calls to SAFE_FREE before 'error'. * buffer.c (mouse_face_overlay_overlaps): * editfns.c (Fget_pos_property, check_translation): * eval.c (Ffuncall): * font.c (font_unparse_xlfd, font_find_for_lface): * ftfont.c (ftfont_drive_otf): * keyboard.c (echo_add_key, read_decoded_event_from_main_queue) (menu_bar_items, tool_bar_items): * sound.c (Fplay_sound_internal): * xdisp.c (load_overlay_strings, dump_glyph_row): Use an ordinary auto buffer rather than alloca, since the allocation size is fixed and small. * ftfont.c: Include <c-strcase.h>. (matching_prefix): New function. (get_adstyle_property): Use it, to avoid need for alloca. * keyboard.c (echo_add_key): * keymap.c (describe_map): Use ptrdiff_t, not int. * keyboard.c (echo_add_key): Prefer sizeof to strlen. * keymap.c (Fdescribe_buffer_bindings): Use SBYTES, not SCHARS, when counting bytes. * lisp.h (xlispstrdupa): Remove, replacing with ... (SAFE_ALLOCA_STRING): ... new macro with different API. This fixes a portability problem, namely, alloca result passed to another function. All uses changed. (SAFE_ALLOCA, SAFE_ALLOCA_LISP): Check for MAX_ALLOCA, not MAX_ALLOCA - 1. * regex.c (REGEX_USE_SAFE_ALLOCA, REGEX_SAFE_FREE) (REGEX_ALLOCATE): New macros. (REGEX_REALLOCATE, REGEX_ALLOCATE_STACK, REGEX_REALLOCATE_STACK) (REGEX_FREE_STACK, FREE_VARIABLES, re_match_2_internal): Use them. * xdisp.c (message3): Use SAFE_ALLOCA_STRING rather than doing it by hand. (decode_mode_spec_coding): Store directly into buf rather than into an alloca temporary and copying the temporary to the buf. Fixes: debbugs:18410
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 45e614fb449..7a6ddfa719d 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3053,13 +3053,15 @@ mouse_face_overlay_overlaps (Lisp_Object overlay)
3053 ptrdiff_t end = OVERLAY_POSITION (OVERLAY_END (overlay)); 3053 ptrdiff_t end = OVERLAY_POSITION (OVERLAY_END (overlay));
3054 ptrdiff_t n, i, size; 3054 ptrdiff_t n, i, size;
3055 Lisp_Object *v, tem; 3055 Lisp_Object *v, tem;
3056 Lisp_Object vbuf[10];
3057 USE_SAFE_ALLOCA;
3056 3058
3057 size = 10; 3059 size = ARRAYELTS (vbuf);
3058 v = alloca (size * sizeof *v); 3060 v = vbuf;
3059 n = overlays_in (start, end, 0, &v, &size, NULL, NULL); 3061 n = overlays_in (start, end, 0, &v, &size, NULL, NULL);
3060 if (n > size) 3062 if (n > size)
3061 { 3063 {
3062 v = alloca (n * sizeof *v); 3064 SAFE_NALLOCA (v, 1, n);
3063 overlays_in (start, end, 0, &v, &n, NULL, NULL); 3065 overlays_in (start, end, 0, &v, &n, NULL, NULL);
3064 } 3066 }
3065 3067
@@ -3069,6 +3071,7 @@ mouse_face_overlay_overlaps (Lisp_Object overlay)
3069 !NILP (tem))) 3071 !NILP (tem)))
3070 break; 3072 break;
3071 3073
3074 SAFE_FREE ();
3072 return i < n; 3075 return i < n;
3073} 3076}
3074 3077
@@ -4517,13 +4520,13 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
4517 First copy the vector contents, in case some of these hooks 4520 First copy the vector contents, in case some of these hooks
4518 do subsequent modification of the buffer. */ 4521 do subsequent modification of the buffer. */
4519 ptrdiff_t size = last_overlay_modification_hooks_used; 4522 ptrdiff_t size = last_overlay_modification_hooks_used;
4520 Lisp_Object *copy = alloca (size * sizeof *copy); 4523 Lisp_Object *copy;
4521 ptrdiff_t i; 4524 ptrdiff_t i;
4522 4525
4526 USE_SAFE_ALLOCA;
4527 SAFE_ALLOCA_LISP (copy, size);
4523 memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents, 4528 memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents,
4524 size * word_size); 4529 size * word_size);
4525 gcpro1.var = copy;
4526 gcpro1.nvars = size;
4527 4530
4528 for (i = 0; i < size;) 4531 for (i = 0; i < size;)
4529 { 4532 {
@@ -4532,6 +4535,8 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
4532 overlay_i = copy[i++]; 4535 overlay_i = copy[i++];
4533 call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3); 4536 call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
4534 } 4537 }
4538
4539 SAFE_FREE ();
4535 } 4540 }
4536 UNGCPRO; 4541 UNGCPRO;
4537} 4542}