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