From 84c33579d66f72c9b1f11a4bcb8ffc6787843faf Mon Sep 17 00:00:00 2001 From: Kaz Kylheku 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(-) 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