size_t bytes_read;
keyval_t *kv;
int type;
+ size_t byte_size;
if (r == NULL) {
set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
while (p_r < d_r + d_len - 1) {
kv = NULL; /* To get a new kv */
+ byte_size = d_r + d_len - 1 - p_r;
+ if (byte_size < sizeof(size_t))
+ break;
+
/* Find type, and use decode function according to type */
type = keyval_get_type_from_encoded_byte(p_r);
if (keyval_type_is_array(type)) {
bytes_read = keyval_array_decode(p_r,
- (keyval_array_t **)&kv,
- d_r + d_len - 1 - p_r);
+ (keyval_array_t **)&kv, byte_size);
} else {
- bytes_read = keyval_decode(p_r, &kv,
- d_r + d_len - 1 - p_r);
+ bytes_read = keyval_decode(p_r, &kv, byte_size);
}
if (kv)
size_t bytes_read;
keyval_t *kv;
int type;
+ size_t byte_size;
if (r == NULL) {
set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
while (p_r < d_r + d_len - 1) {
kv = NULL; /* To get a new kv */
+ byte_size = d_r + d_len - 1 - p_r;
+ if (byte_size < sizeof(size_t))
+ break;
+
/* Find type, and use decode function according to type */
type = keyval_get_type_from_encoded_byte(p_r);
if (keyval_type_is_array(type)) {
bytes_read = keyval_array_decode(p_r,
- (keyval_array_t **)&kv,
- d_r + d_len - 1 - p_r);
+ (keyval_array_t **)&kv, byte_size);
} else {
- bytes_read = keyval_decode(p_r, &kv,
- d_r + d_len - 1 - p_r);
+ bytes_read = keyval_decode(p_r, &kv, byte_size);
}
if (kv)
return NULL;
}
+ if (byte_size < sizeof(size_t)) {
+ free(byte);
+ byte = NULL;
+ byte_size = 0;
+ continue;
+ }
+
type = keyval_get_type_from_encoded_byte(byte);
if (keyval_type_is_array(type)) {
if (keyval_array_decode(byte, &kva, byte_size) == 0) /* TODO: error! */
free(byte);
byte = NULL;
+ byte_size = 0;
}
set_last_result(BUNDLE_ERROR_NONE);
void *array_val;
int i;
size_t elem_size = 0;
+ size_t sum_array_element_size = 0;
+ size_t encoded_size;
/* Get data */
byte_len = *((size_t *)p);
byte_size -= sz_keysize;
p += sz_keysize;
key = (char *)p;
+ if ((strlen(key) + 1) != keysize)
+ return 0;
if (byte_size < keysize)
return 0;
p += sizeof(size_t) * len;
array_val = (void *)p;
+ for (i = 0; i < len; ++i)
+ sum_array_element_size += array_element_size[i];
+
+ encoded_size = sz_byte_len + sz_type + sz_keysize + keysize +
+ sz_len + (sizeof(size_t) * len) sum_array_element_size;
+ if (encoded_size != byte_len)
+ return 0;
+
*kva = keyval_array_new(NULL, key, type, NULL, len);
for (i = 0; i < len; i++) {
elem_size += i ? array_element_size[i - 1] : 0;