Skip to content

Commit db405c4

Browse files
committed
Fix memory leak when serializing a class with a unserialize entry
1 parent 3572938 commit db405c4

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

msgpack_unpack.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ inline static void msgpack_stack_pop(msgpack_unserialize_data_t *var_hashx, long
133133
}
134134

135135
inline static zend_class_entry* msgpack_unserialize_class(
136-
zval **container, char *class_name, size_t name_len)
136+
zval **container, char *class_name, size_t name_len, zend_bool init_class)
137137
{
138138
zend_class_entry *ce;
139139
zend_bool incomplete_class = 0;
@@ -199,7 +199,9 @@ inline static zend_class_entry* msgpack_unserialize_class(
199199
return NULL;
200200
}
201201

202-
object_init_ex(container_val, ce);
202+
if (init_class || incomplete_class) {
203+
object_init_ex(container_val, ce);
204+
}
203205

204206
/* store incomplete class name */
205207
if (incomplete_class)
@@ -481,8 +483,7 @@ int msgpack_unserialize_map_item(
481483
break;
482484
}
483485
} else if (Z_TYPE_P(val) == IS_STRING) {
484-
ce = msgpack_unserialize_class(
485-
container, Z_STRVAL_P(val), Z_STRLEN_P(val));
486+
ce = msgpack_unserialize_class(container, Z_STRVAL_P(val), Z_STRLEN_P(val), 1);
486487

487488
if (ce == NULL) {
488489
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
@@ -499,7 +500,7 @@ int msgpack_unserialize_map_item(
499500
case MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT:
500501
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
501502

502-
ce = msgpack_unserialize_class(container, Z_STRVAL_P(key), Z_STRLEN_P(key));
503+
ce = msgpack_unserialize_class(container, Z_STRVAL_P(key), Z_STRLEN_P(key), 0);
503504
if (ce == NULL) {
504505
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
505506

0 commit comments

Comments
 (0)