From eb98afaf354288c583ceb2fbdd647841d5c76b2d Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 27 Dec 2020 09:22:02 +0100 Subject: [PATCH] Fix up length_internal with degenerate length inputs * src/fns.c (length_internal): Protect against edge conditions. --- src/fns.c | 7 +++++-- test/src/fns-tests.el | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) 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) -- 2.39.5