emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master eb98afa: Fix up length_internal with degenerate length inputs


From: Lars Ingebrigtsen
Subject: master eb98afa: Fix up length_internal with degenerate length inputs
Date: Sun, 27 Dec 2020 03:22:11 -0500 (EST)

branch: master
commit eb98afaf354288c583ceb2fbdd647841d5c76b2d
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    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 0fded92..6aad119 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 3486c74..e66dad4 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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]