emacs-diffs
[Top][All Lists]
Advanced

[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))


reply via email to

[Prev in Thread] Current Thread [Next in Thread]