summaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2019-02-27 01:14:27 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2019-02-27 01:23:30 -0800
commite828765d01313acddcf17279b6b43ae9f777f2a4 (patch)
tree8dd465c5899c62ad5613fe97172fad1ddf419097 /src/window.c
parent2f7885a4b3609dec19e4595c6c24f3a21f33c5d6 (diff)
downloademacs-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.c23
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))
{