Skip to content

Commit e241d1a

Browse files
committed
limit initial array size
1 parent ee49fa2 commit e241d1a

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

msgpack_unpack.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ int msgpack_unserialize_ext(msgpack_unserialize_data *unpack, const char* base,
477477
int msgpack_unserialize_array(msgpack_unserialize_data *unpack, unsigned int count, zval **obj) /* {{{ */ {
478478
MSGPACK_UNSERIALIZE_ALLOC_VALUE(unpack);
479479

480-
array_init_size(*obj, count);
480+
array_init_size(*obj, MIN(count, 1<<16));
481481

482482
if (count) {
483483
unpack->stack[unpack->deps++] = count;
@@ -488,7 +488,13 @@ int msgpack_unserialize_array(msgpack_unserialize_data *unpack, unsigned int cou
488488
/* }}} */
489489

490490
int msgpack_unserialize_array_item(msgpack_unserialize_data *unpack, zval **container, zval *obj) /* {{{ */ {
491-
zval *nval = zend_hash_next_index_insert(Z_ARRVAL_P(*container), obj);
491+
zval *nval;
492+
493+
if (!*container || Z_TYPE_P(*container) != IS_ARRAY) {
494+
return -1;
495+
}
496+
497+
nval = zend_hash_next_index_insert(Z_ARRVAL_P(*container), obj);
492498

493499
if (MSGPACK_IS_STACK_VALUE(obj)) {
494500
MSGPACK_UNSERIALIZE_FINISH_ITEM(unpack, obj, NULL);
@@ -696,7 +702,7 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
696702
}
697703
} else {
698704
if (Z_TYPE_P(container_val) != IS_ARRAY) {
699-
array_init_size(container_val, unpack->count);
705+
array_init_size(container_val, MIN(unpack->count, 1<<16));
700706
}
701707
switch (Z_TYPE_P(key)) {
702708
case IS_LONG:

0 commit comments

Comments
 (0)