From: Lars Ingebrigtsen Date: Sun, 27 Dec 2020 08:22:02 +0000 (+0100) Subject: Fix up length_internal with degenerate length inputs X-Git-Tag: emacs-28.0.90~4546 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=eb98afaf354288c583ceb2fbdd647841d5c76b2d;p=emacs.git Fix up length_internal with degenerate length inputs * src/fns.c (length_internal): Protect against edge conditions. --- diff --git a/src/fns.c b/src/fns.c index 0fded92aeb2..6aad119d1f9 100644 --- a/src/fns.c +++ b/src/fns.c @@ -159,14 +159,14 @@ EMACS_INT length_internal (Lisp_Object sequence, int len) if (len < 0xffff) while (CONSP (sequence)) { - if (--len == 0) + if (--len <= 0) return -1; sequence = XCDR (sequence); } /* Signal an error on circular lists. */ else FOR_EACH_TAIL (sequence) - if (--len == 0) + if (--len <= 0) return -1; return len; } @@ -210,6 +210,9 @@ counted. */) CHECK_FIXNUM (length); EMACS_INT len = XFIXNUM (length); + if (len < 0) + return Qnil; + if (CONSP (sequence)) return length_internal (sequence, len + 1) == 1? Qt: Qnil; else diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el index 3486c745bf3..e66dad44a1a 100644 --- a/test/src/fns-tests.el +++ b/test/src/fns-tests.el @@ -1025,6 +1025,17 @@ (should (length= "abc" 3)) (should-not (length= "abc" 4)) + (should-not (length< (list 1 2 3) -1)) + (should-not (length< (list 1 2 3) 0)) + (should-not (length< (list 1 2 3) -10)) + + (should (length> (list 1 2 3) -1)) + (should (length> (list 1 2 3) 0)) + + (should-not (length= (list 1 2 3) -1)) + (should-not (length= (list 1 2 3) 0)) + (should-not (length= (list 1 2 3) 1)) + (should-error (let ((list (list 1))) (setcdr list list)