1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-04 11:40:22 +00:00

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.
This commit is contained in:
Eli Zaretskii 2016-05-27 12:17:15 +03:00
parent 4ab2673d87
commit f7ffc4b7d3
2 changed files with 15 additions and 3 deletions

View File

@ -484,13 +484,16 @@ of course, also replace TO with a slightly larger value
(list from)
(or inc (setq inc 1))
(when (zerop inc) (error "The increment can not be zero"))
(let (seq (n 0) (next from))
(let (seq (n 0) (next from) (last from))
(if (> inc 0)
(while (<= next to)
;; The (>= next last) condition protects against integer
;; overflow in computing NEXT.
(while (and (>= next last) (<= next to))
(setq seq (cons next seq)
n (1+ n)
last next
next (+ from (* n inc))))
(while (>= next to)
(while (and (<= next last) (>= next to))
(setq seq (cons next seq)
n (1+ n)
next (+ from (* n inc)))))

View File

@ -61,6 +61,15 @@
(quote
(0 font-lock-keyword-face))))))))
(ert-deftest number-sequence-test ()
(should (= (length
(number-sequence (1- most-positive-fixnum) most-positive-fixnum))
2))
(should (= (length
(number-sequence
(1+ most-negative-fixnum) most-negative-fixnum -1))
2)))
(ert-deftest string-comparison-test ()
(should (string-lessp "abc" "acb"))
(should (string-lessp "aBc" "abc"))