#include "config.h"
+#include <limits.h>
+
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <string.h>
int new_size;
if(max < arr->size) return 0;
- new_size = arr->size << 1;
- if (new_size < max)
+ /* Avoid undefined behaviour on int32 overflow */
+ if( arr->size >= INT_MAX / 2 )
new_size = max;
- if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1;
+ else
+ {
+ new_size = arr->size << 1;
+ if (new_size < max)
+ new_size = max;
+ }
+ if((size_t)new_size > (~((size_t)0)) / sizeof(void*)) return -1;
+ if(!(t = realloc(arr->array, ((size_t)new_size)*sizeof(void*)))) return -1;
arr->array = (void**)t;
(void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
arr->size = new_size;
int
array_list_put_idx(struct array_list *arr, int idx, void *data)
{
+ if( idx < 0 || idx > INT_MAX - 1 ) return -1;
if(array_list_expand_internal(arr, idx+1)) return -1;
if(arr->array[idx]) arr->free_fn(arr->array[idx]);
arr->array[idx] = data;
state = json_tokener_state_eatws;
saved_state = json_tokener_state_object_field_start;
current = json_object_new_object();
+ if(current == NULL)
+ goto out;
break;
case '[':
state = json_tokener_state_eatws;
saved_state = json_tokener_state_array;
current = json_object_new_array();
+ if(current == NULL)
+ goto out;
break;
case 'I':
case 'i':
if (tok->st_pos == json_inf_str_len)
{
current = json_object_new_double(is_negative ? -INFINITY : INFINITY);
+ if(current == NULL)
+ goto out;
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
if (tok->st_pos == json_nan_str_len)
{
current = json_object_new_double(NAN);
+ if (current == NULL)
+ goto out;
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
if(c == tok->quote_char) {
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos);
+ if(current == NULL)
+ goto out;
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
break;
) {
if(tok->st_pos == json_true_str_len) {
current = json_object_new_boolean(1);
+ if(current == NULL)
+ goto out;
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
|| (strncmp(json_false_str, tok->pb->buf, size2) == 0)) {
if(tok->st_pos == json_false_str_len) {
current = json_object_new_boolean(0);
+ if(current == NULL)
+ goto out;
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
goto out;
}
current = json_object_new_int64(num64);
+ if(current == NULL)
+ goto out;
}
else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0)
{
current = json_object_new_double_s(numd, tok->pb->buf);
+ if(current == NULL)
+ goto out;
} else {
tok->err = json_tokener_error_parse_number;
goto out;
break;
case json_tokener_state_array_add:
- json_object_array_add(current, obj);
+ if( json_object_array_add(current, obj) != 0 )
+ goto out;
saved_state = json_tokener_state_array_sep;
state = json_tokener_state_eatws;
goto redo_char;