diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-09-23 21:33:01 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-09-23 21:33:01 -0700 |
commit | 57f625f68909a4420e5621a2f40717427ecf63e2 (patch) | |
tree | 6304b8e32c2b8119af7213576550b557af656fd5 /lib.c | |
parent | 77b5a3eda0eda28b30addcfcd62cce1bae8542cf (diff) | |
download | txr-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.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -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"), |