Skip to content

Commit

Permalink
Issue #332: fix a long-standing bug in array_list_put_idx() where it …
Browse files Browse the repository at this point in the history
…would attempt to free previously free'd entries due to not checking the current array length.

Add a test that triggers the problem to ensure it stays fixed.
  • Loading branch information
hawicz committed Jul 9, 2017
1 parent 7fd74fc commit fd9b3b2
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
3 changes: 2 additions & 1 deletion arraylist.c
Expand Up @@ -96,7 +96,8 @@ array_list_put_idx(struct array_list *arr, size_t idx, void *data)
{
if (idx > SIZE_T_MAX - 1 ) return -1;
if(array_list_expand_internal(arr, idx+1)) return -1;
if(arr->array[idx]) arr->free_fn(arr->array[idx]);
if(idx < arr->length && arr->array[idx])
arr->free_fn(arr->array[idx]);
arr->array[idx] = data;
if(arr->length <= idx) arr->length = idx + 1;
return 0;
Expand Down
13 changes: 13 additions & 0 deletions tests/test1.c
Expand Up @@ -120,6 +120,19 @@ void test_array_del_idx()
(int)(orig_array_len + 1), rc, json_object_to_json_string(my_array));

json_object_put(my_array);

/* Delete some array indexes, then add more */
my_array = make_array();
rc = json_object_array_del_idx(my_array, 0, orig_array_len - 1);
printf("after del_idx(0,%d)=%d, my_array.to_string()=%s\n",
(int)(orig_array_len - 1), rc, json_object_to_json_string(my_array));
json_object_array_add(my_array, json_object_new_string("s1"));
json_object_array_add(my_array, json_object_new_string("s2"));
json_object_array_add(my_array, json_object_new_string("s3"));

printf("after adding more entries, my_array.to_string()=%s\n",
json_object_to_json_string(my_array));
json_object_put(my_array);
}

int main(int argc, char **argv)
Expand Down

0 comments on commit fd9b3b2

Please sign in to comment.