diff options
author | Nicolas Williams <nico@cryptonector.com> | 2014-08-09 19:04:34 -0500 |
---|---|---|
committer | Nicolas Williams <nico@cryptonector.com> | 2014-08-09 19:15:50 -0500 |
commit | 20ca21cb0d0025c69b8bf41d4d93541c289a8ddf (patch) | |
tree | b9882e11e91e5b465be59e25ae3165a82c7de1b4 | |
parent | 2d1a75f550a14cb18cc85014430d33aa1c617a5b (diff) |
Out of bounds negative array indices should raise
-rw-r--r-- | jv.c | 14 | ||||
-rw-r--r-- | tests/all.test | 8 |
2 files changed, 13 insertions, 9 deletions
@@ -230,13 +230,9 @@ static jv* jvp_array_read(jv a, int i) { } static jv* jvp_array_write(jv* a, int i) { + assert(i >= 0); jvp_array* array = jvp_array_ptr(*a); - if (i < 0) - i = array->length + i; - if (i < 0) - i = 0; - int pos = i + jvp_array_offset(*a); if (pos < array->alloc_length && jvp_refcnt_unshared(a->u.ptr)) { // use existing array space @@ -325,6 +321,14 @@ jv jv_array_get(jv j, int idx) { jv jv_array_set(jv j, int idx, jv val) { assert(jv_get_kind(j) == JV_KIND_ARRAY); + + if (idx < 0) + idx = jvp_array_length(j) + idx; + if (idx < 0) { + jv_free(j); + jv_free(val); + return jv_invalid_with_msg(jv_string("Out of bounds negative array index")); + } // copy/free of val,j coalesced jv* slot = jvp_array_write(&j, idx); jv_free(*slot); diff --git a/tests/all.test b/tests/all.test index 99e95b76..d1cdc2ca 100644 --- a/tests/all.test +++ b/tests/all.test @@ -156,13 +156,13 @@ null # Negative array indices # -.foo[-1] = 0 +try (.foo[-1] = 0) catch . null -{"foo":[0]} +"Out of bounds negative array index" -.foo[-2] = 0 +try (.foo[-2] = 0) catch . null -{"foo":[0]} +"Out of bounds negative array index" .[-1] = 5 [0,1,2] |