From 97fce155c0b92429b9deabfca31e35dbb5fe0d8f Mon Sep 17 00:00:00 2001
From: Kaz Kylheku <kaz@kylheku.com>
Date: Wed, 18 May 2016 06:29:06 -0700
Subject: Handle integer overflow in length_list.

* lib.c (length_list): Count using cnum
only up to INT_PTR_MAX, then switch to
bignums.
---
 lib.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

(limited to 'lib.c')

diff --git a/lib.c b/lib.c
index 03409125..a0333930 100644
--- a/lib.c
+++ b/lib.c
@@ -2629,14 +2629,26 @@ val proper_list_p(val obj)
 val length_list(val list)
 {
   cnum len = 0;
+  val bn_len;
 
   gc_hint(list);
 
-  while (consp(list)) {
+  while (consp(list) && len < INT_PTR_MAX) {
     len++;
     list = cdr(list);
   }
-  return num(len);
+
+  if (len < INT_PTR_MAX)
+    return num(len);
+
+  bn_len = num(INT_PTR_MAX);
+
+  while (consp(list)) {
+    bn_len = succ(bn_len);
+    list = cdr(list);
+  }
+
+  return bn_len;
 }
 
 val getplist(val list, val key)
-- 
cgit v1.2.3