]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix up length_internal with degenerate length inputs
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 27 Dec 2020 08:22:02 +0000 (09:22 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 27 Dec 2020 08:22:02 +0000 (09:22 +0100)
* src/fns.c (length_internal): Protect against edge conditions.

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

index 0fded92aeb27deede53a2087ebc11e8e8b050ff2..6aad119d1f922e8081e7ce43c2e828766acbf56d 100644 (file)
--- 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
index 3486c745bf30d5ea72f5c1da222f2a7b59977cb4..e66dad44a1ad831bcadfcffbb679886ab9e99cbd 100644 (file)
   (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)