diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-05-18 06:29:06 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-05-18 06:29:06 -0700 |
commit | 84c33579d66f72c9b1f11a4bcb8ffc6787843faf (patch) | |
tree | 08c0fada23ba0d93127e6dae0998f0a652963bdb | |
parent | 1473dd93535a9f0b8fa793aab9851070f9d4ede5 (diff) | |
download | txr-84c33579d66f72c9b1f11a4bcb8ffc6787843faf.tar.gz txr-84c33579d66f72c9b1f11a4bcb8ffc6787843faf.tar.bz2 txr-84c33579d66f72c9b1f11a4bcb8ffc6787843faf.zip |
Handle integer overflow in length_list.
* lib.c (length_list): Count using cnum
only up to INT_PTR_MAX, then switch to
bignums.
-rw-r--r-- | lib.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -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) |