diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2019-02-27 01:14:27 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-02-27 01:23:30 -0800 |
commit | e828765d01313acddcf17279b6b43ae9f777f2a4 (patch) | |
tree | 8dd465c5899c62ad5613fe97172fad1ddf419097 /src/window.c | |
parent | 2f7885a4b3609dec19e4595c6c24f3a21f33c5d6 (diff) | |
download | emacs-e828765d01313acddcf17279b6b43ae9f777f2a4.tar.gz |
DEFVAR_INT variables are now intmax_t
Formerly they were fixnums, which led to problems when dealing
with values that might not fit on 32-bit platforms, such as
string-chars-consed or floats_consed. 64-bit counters should
be good enough for these (for a while, anyway...).
While we’re at it, fix some unlikely integer overflow bugs
that have been in the code for a while.
* lib-src/make-docfile.c (write_globals):
* src/data.c (do_symval_forwarding, store_symval_forwarding):
* src/eval.c (restore_stack_limits, call_debugger):
* src/frame.h (struct frame.cost_calculation_baud_rate):
* src/keyboard.c (last_auto_save, bind_polling_period, read_char):
* src/lisp.h (struct Lisp_Intfwd.intvar):
* src/lread.c (defvar_int):
* src/pdumper.c (dump_fwd_int):
* src/thread.h (struct thread_state.m_lisp_eval_depth):
* src/undo.c (truncate_undo_list):
* src/xselect.c (wait_for_property_change)
(x_get_foreign_selection):
* src/xterm.c (x_emacs_to_x_modifiers):
DEFVAR_INT variables now have the C type intmax_t, not EMACS_INT.
* src/data.c (store_symval_forwarding):
* src/gnutls.c (Fgnutls_boot):
* src/keyboard.c (bind_polling_period):
* src/macros.c (pop_kbd_macro, Fexecute_kbd_macro):
* src/undo.c (truncate_undo_list):
Allow any integer that fits into intmax_t, instead of
requiring it to be a Lisp fixnum.
* src/dispnew.c (update_window):
* src/frame.c (x_figure_window_size):
* src/gnutls.c (init_gnutls_functions)
(emacs_gnutls_handle_error):
* src/keyboard.c (make_lisp_event):
* src/nsterm.m (ns_dumpglyphs_image):
* src/profiler.c (make_log):
* src/scroll.c (calculate_scrolling)
(calculate_direct_scrolling):
* src/termcap.c (tputs):
* src/xterm.c (x_draw_image_relief):
Avoid implementation-defined behavior on conversion of
out-of-range integers.
* src/eval.c (when_entered_debugger): Now intmax_t.
(max_ensure_room): New function, that avoids signed integer overflow.
(call_debugger, signal_or_quit): Use it.
* src/fileio.c (Fdo_auto_save):
* src/keyboard.c (make_lisp_event):
* src/term.c (calculate_costs):
* src/xdisp.c (build_desired_tool_bar_string)
(hscroll_window_tree, try_scrolling, decode_mode_spec)
(x_produce_glyphs):
Avoid signed integer overflow.
* src/lisp.h (clip_to_bounds): Generalize to intmax_t.
* src/pdumper.c (dump_emacs_reloc_immediate_emacs_int): Remove, ...
(dump_emacs_reloc_immediate_intmax_t): ... replacing with this
function. All uses changed.
* src/profiler.c (make_log): Omit args. All callers changed.
* src/termcap.c: Include stdlib.h, for atoi.
Include intprops.h.
* src/window.c (sanitize_next_screen_context_lines): New function.
(window_scroll_pixel_based, window_scroll_line_based):
Use it to avoid signed integer overflow.
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/window.c b/src/window.c index 49d7fc2426b..fe685d5ab09 100644 --- a/src/window.c +++ b/src/window.c @@ -5445,6 +5445,11 @@ window_scroll_margin (struct window *window, enum margin_unit unit) return 0; } +static int +sanitize_next_screen_context_lines (void) +{ + return clip_to_bounds (0, next_screen_context_lines, 1000000); +} /* Implementation of window_scroll that works based on pixel line heights. See the comment of window_scroll for parameter @@ -5515,9 +5520,11 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror) height. This is important to ensure we get back to the same position when scrolling up, then down. */ if (whole) - dy = max ((window_box_height (w) / dy - - next_screen_context_lines) * dy, - dy); + { + int ht = window_box_height (w); + int nscls = sanitize_next_screen_context_lines (); + dy = max (dy, (ht / dy - nscls) * dy); + } dy *= n; if (n < 0) @@ -5598,13 +5605,14 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror) { ptrdiff_t start_pos = IT_CHARPOS (it); int dy = frame_line_height; + int ht = window_box_height (w); + int nscls = sanitize_next_screen_context_lines (); /* In the below we divide the window box height by the frame's line height to make the result predictable when the window box is not an integral multiple of the line height. This is important to ensure we get back to the same position when scrolling up, then down. */ - dy = max ((window_box_height (w) / dy - next_screen_context_lines) * dy, - dy) * n; + dy = n * max (dy, (ht / dy - nscls) * dy); /* Note that move_it_vertically always moves the iterator to the start of a line. So, if the last line doesn't have a newline, @@ -5902,7 +5910,10 @@ window_scroll_line_based (Lisp_Object window, int n, bool whole, bool noerror) /* If scrolling screen-fulls, compute the number of lines to scroll from the window's height. */ if (whole) - n *= max (1, ht - next_screen_context_lines); + { + int nscls = sanitize_next_screen_context_lines (); + n *= max (1, ht - nscls); + } if (!NILP (Vscroll_preserve_screen_position)) { |