summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-09-23 21:33:01 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-09-23 21:33:01 -0700
commit57f625f68909a4420e5621a2f40717427ecf63e2 (patch)
tree6304b8e32c2b8119af7213576550b557af656fd5 /lib.c
parent77b5a3eda0eda28b30addcfcd62cce1bae8542cf (diff)
downloadtxr-57f625f68909a4420e5621a2f40717427ecf63e2.tar.gz
txr-57f625f68909a4420e5621a2f40717427ecf63e2.tar.bz2
txr-57f625f68909a4420e5621a2f40717427ecf63e2.zip
Bugfix: out-of-range negative indices into lists.
We have a problem not handling negative list indices which index beyond the beginning of the list. Such accesses are just storing and retrieving the first element! * lib.c (listref): If a negative index is still negative after the length of the list is added to it, then return nil. Do not return car(list)! (listref_l): Similary, do not return car_l(list) if the index is less than zero, so that an error occurs for an out-of-range negative index. * txr.1: Update the documentation for ref to describe these indexing constraints, and also to include hashes.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib.c b/lib.c
index 47b028cf..85ff5d33 100644
--- a/lib.c
+++ b/lib.c
@@ -520,8 +520,11 @@ val lazy_conses(val list)
val listref(val list, val ind)
{
gc_hint(list);
- if (lt(ind, zero))
+ if (lt(ind, zero)) {
ind = plus(ind, length_list(list));
+ if (lt(ind, zero))
+ return nil;
+ }
for (; gt(ind, zero); ind = minus(ind, one))
list = cdr(list);
return car(list);
@@ -537,7 +540,7 @@ loc listref_l(val list, val ind)
for (; gt(ind, zero) && list; ind = minus(ind, one))
list = cdr(list);
- if (consp(list))
+ if (ge(ind, zero) && consp(list))
return car_l(list);
uw_throwf(error_s, lit("~s has no assignable location at ~s"),