[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] /srv/bzr/emacs/trunk r108791: Avoid integer overflow on sc
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] /srv/bzr/emacs/trunk r108791: Avoid integer overflow on scroll-left and scroll-right. |
Date: |
Thu, 28 Jun 2012 08:50:11 -0700 |
User-agent: |
Bazaar (2.5.0) |
------------------------------------------------------------
revno: 108791
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Thu 2012-06-28 08:50:11 -0700
message:
Avoid integer overflow on scroll-left and scroll-right.
* window.c (HSCROLL_MAX): New macro.
(Fscroll_left, Fscroll_right): Avoid undefined behavior on integer
overflow when requested scroll falls outside ptrdiff_t range.
modified:
src/ChangeLog
src/window.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2012-06-28 12:29:37 +0000
+++ b/src/ChangeLog 2012-06-28 15:50:11 +0000
@@ -1,3 +1,10 @@
+2012-06-28 Paul Eggert <address@hidden>
+
+ Avoid integer overflow on scroll-left and scroll-right.
+ * window.c (HSCROLL_MAX): New macro.
+ (Fscroll_left, Fscroll_right): Avoid undefined behavior on integer
+ overflow when requested scroll falls outside ptrdiff_t range.
+
2012-06-28 Dmitry Antipov <address@hidden>
* window.h (struct window): Change type of 'hscroll',
=== modified file 'src/window.c'
--- a/src/window.c 2012-06-28 12:29:37 +0000
+++ b/src/window.c 2012-06-28 15:50:11 +0000
@@ -3244,7 +3244,7 @@
o = XWINDOW (window);
p = allocate_window ();
- memcpy ((char *) p + sizeof (struct vectorlike_header),
+ memcpy ((char *) p + sizeof (struct vectorlike_header),
(char *) o + sizeof (struct vectorlike_header),
sizeof (Lisp_Object) * VECSIZE (struct window));
XSETWINDOW (parent, p);
@@ -4857,6 +4857,9 @@
return Qnil;
}
+/* Scrolling amount must fit in both ptrdiff_t and Emacs fixnum. */
+#define HSCROLL_MAX min (PTRDIFF_MAX, MOST_POSITIVE_FIXNUM)
+
DEFUN ("scroll-left", Fscroll_left, Sscroll_left, 0, 2, "^P\np",
doc: /* Scroll selected window display ARG columns left.
Default for ARG is window width minus 2.
@@ -4871,13 +4874,12 @@
Lisp_Object result;
ptrdiff_t hscroll;
struct window *w = XWINDOW (selected_window);
-
- if (NILP (arg))
- XSETFASTINT (arg, window_body_cols (w) - 2);
- else
- arg = Fprefix_numeric_value (arg);
-
- hscroll = w->hscroll + XINT (arg);
+ EMACS_INT requested_arg = (NILP (arg)
+ ? window_body_cols (w) - 2
+ : XINT (Fprefix_numeric_value (arg)));
+ ptrdiff_t clipped_arg =
+ clip_to_bounds (- w->hscroll, requested_arg, HSCROLL_MAX - w->hscroll);
+ hscroll = w->hscroll + clipped_arg;
result = Fset_window_hscroll (selected_window, make_number (hscroll));
if (!NILP (set_minimum))
@@ -4900,13 +4902,12 @@
Lisp_Object result;
ptrdiff_t hscroll;
struct window *w = XWINDOW (selected_window);
-
- if (NILP (arg))
- XSETFASTINT (arg, window_body_cols (w) - 2);
- else
- arg = Fprefix_numeric_value (arg);
-
- hscroll = w->hscroll - XINT (arg);
+ EMACS_INT requested_arg = (NILP (arg)
+ ? window_body_cols (w) - 2
+ : XINT (Fprefix_numeric_value (arg)));
+ ptrdiff_t clipped_arg =
+ clip_to_bounds (w->hscroll - HSCROLL_MAX, requested_arg, w->hscroll);
+ hscroll = w->hscroll - clipped_arg;
result = Fset_window_hscroll (selected_window, make_number (hscroll));
if (!NILP (set_minimum))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] /srv/bzr/emacs/trunk r108791: Avoid integer overflow on scroll-left and scroll-right.,
Paul Eggert <=