[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master eb98afa: Fix up length_internal with degenerate length inputs,
Lars Ingebrigtsen <=