]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix signal for large integers with valid syntax
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 17 Apr 2018 23:23:16 +0000 (16:23 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 17 Apr 2018 23:23:48 +0000 (16:23 -0700)
* src/lread.c (read_integer): If a radixed integer has valid syntax
but is waayyy too large, signal overflow instead of invalid syntax.
* test/src/lread-tests.el (lread-long-hex-integer): New test.

src/lread.c
test/src/lread-tests.el

index 65d22af69374625b752ee58e8451cffca8bd9814..6eda7405409d71fac27f66f9ca941c2492233ff7 100644 (file)
@@ -2644,14 +2644,13 @@ read_integer (Lisp_Object readcharfun, EMACS_INT radix)
      Also, room for invalid syntax diagnostic.  */
   char buf[max (1 + 1 + UINTMAX_WIDTH + 1,
                sizeof "integer, radix " + INT_STRLEN_BOUND (EMACS_INT))];
-
+  char *p = buf;
   int valid = -1; /* 1 if valid, 0 if not, -1 if incomplete.  */
 
   if (radix < 2 || radix > 36)
     valid = 0;
   else
     {
-      char *p = buf;
       int c, digit;
 
       c = READCHAR;
@@ -2679,17 +2678,12 @@ read_integer (Lisp_Object readcharfun, EMACS_INT radix)
            valid = 0;
          if (valid < 0)
            valid = 1;
-
-         if (p < buf + sizeof buf - 1)
-           *p++ = c;
-         else
-           valid = 0;
-
+         *p = c;
+         p += p < buf + sizeof buf;
          c = READCHAR;
        }
 
       UNREAD (c);
-      *p = '\0';
     }
 
   if (valid != 1)
@@ -2698,6 +2692,13 @@ read_integer (Lisp_Object readcharfun, EMACS_INT radix)
       invalid_syntax (buf);
     }
 
+  if (p == buf + sizeof buf)
+    {
+      memset (p - 3, '.', 3);
+      xsignal1 (Qoverflow_error, make_unibyte_string (buf, sizeof buf));
+    }
+
+  *p = '\0';
   return string_to_number (buf, radix, 0);
 }
 
index daf53438811295dcc0ff3680b9b799d0a373841a..708701a8887d899deb232205e563d19fb778d555 100644 (file)
@@ -194,4 +194,9 @@ literals (Bug#20852)."
     (lread--substitute-object-in-subtree x 1 t)
     (should (eq x (cdr x)))))
 
+(ert-deftest lread-long-hex-integer ()
+  (should-error
+   (read "#xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
+   :type 'overflow-error))
+
 ;;; lread-tests.el ends here