aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2016-05-27 12:17:15 +0300
committerEli Zaretskii2016-05-27 12:17:15 +0300
commitf7ffc4b7d36041eba2abe9bc34927413f48056d4 (patch)
tree21016675c4b801c9a7d40e8b69e369a9ca92429b
parent4ab2673d87794dbbe4db33856c0dc69e4b06db71 (diff)
downloademacs-f7ffc4b7d36041eba2abe9bc34927413f48056d4.tar.gz
emacs-f7ffc4b7d36041eba2abe9bc34927413f48056d4.zip
Fix infloop in 'number-sequence'
* lisp/subr.el (number-sequence): Avoid overflow leading to an infloop. (Bug#23627) * test/automated/subr-tests.el (number-sequence-test): New test.
-rw-r--r--lisp/subr.el9
-rw-r--r--test/automated/subr-tests.el9
2 files changed, 15 insertions, 3 deletions
diff --git a/lisp/subr.el b/lisp/subr.el
index 3ac61f9a45f..43660d74377 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -484,13 +484,16 @@ of course, also replace TO with a slightly larger value
484 (list from) 484 (list from)
485 (or inc (setq inc 1)) 485 (or inc (setq inc 1))
486 (when (zerop inc) (error "The increment can not be zero")) 486 (when (zerop inc) (error "The increment can not be zero"))
487 (let (seq (n 0) (next from)) 487 (let (seq (n 0) (next from) (last from))
488 (if (> inc 0) 488 (if (> inc 0)
489 (while (<= next to) 489 ;; The (>= next last) condition protects against integer
490 ;; overflow in computing NEXT.
491 (while (and (>= next last) (<= next to))
490 (setq seq (cons next seq) 492 (setq seq (cons next seq)
491 n (1+ n) 493 n (1+ n)
494 last next
492 next (+ from (* n inc)))) 495 next (+ from (* n inc))))
493 (while (>= next to) 496 (while (and (<= next last) (>= next to))
494 (setq seq (cons next seq) 497 (setq seq (cons next seq)
495 n (1+ n) 498 n (1+ n)
496 next (+ from (* n inc))))) 499 next (+ from (* n inc)))))
diff --git a/test/automated/subr-tests.el b/test/automated/subr-tests.el
index 7906a207a96..ce212903c9d 100644
--- a/test/automated/subr-tests.el
+++ b/test/automated/subr-tests.el
@@ -61,6 +61,15 @@
61 (quote 61 (quote
62 (0 font-lock-keyword-face)))))))) 62 (0 font-lock-keyword-face))))))))
63 63
64(ert-deftest number-sequence-test ()
65 (should (= (length
66 (number-sequence (1- most-positive-fixnum) most-positive-fixnum))
67 2))
68 (should (= (length
69 (number-sequence
70 (1+ most-negative-fixnum) most-negative-fixnum -1))
71 2)))
72
64(ert-deftest string-comparison-test () 73(ert-deftest string-comparison-test ()
65 (should (string-lessp "abc" "acb")) 74 (should (string-lessp "abc" "acb"))
66 (should (string-lessp "aBc" "abc")) 75 (should (string-lessp "aBc" "abc"))