Skip to content

Commit c51a499

Browse files
committed
Fix unpacking code, we can't just reuse the stack anymore since the zval's are still used by non_dtor members
1 parent edcaeda commit c51a499

File tree

2 files changed

+4
-35
lines changed

2 files changed

+4
-35
lines changed

msgpack_convert.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,9 @@ int msgpack_convert_array(zval *return_value, zval *tpl, zval **value)
186186
return FAILURE;
187187
}
188188

189-
MSGPACK_CONVERT_COPY_ZVAL(val, dataval);
190-
191189
if (convert_function) {
192190
zval rv;
193-
if (convert_function(&rv, data, &val) != SUCCESS) {
191+
if (convert_function(&rv, data, &dataval) != SUCCESS) {
194192
zval_ptr_dtor(val);
195193
return FAILURE;
196194
}

msgpack_unpack.c

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ typedef struct {
1717
} var_entries;
1818

1919
#define MSGPACK_UNSERIALIZE_FINISH_ITEM(_unpack, _count) \
20-
msgpack_stack_pop(_unpack->var_hash, _count); \
2120
_unpack->stack[_unpack->deps-1]--; \
2221
if (_unpack->stack[_unpack->deps-1] == 0) { \
2322
_unpack->deps--; \
@@ -109,29 +108,6 @@ inline static void msgpack_stack_push(msgpack_unserialize_data_t *var_hashx, zva
109108
*rval = &var_hash->data[var_hash->used_slots++];
110109
}
111110

112-
113-
inline static void msgpack_stack_pop(msgpack_unserialize_data_t *var_hashx, long count)
114-
{
115-
long i;
116-
var_entries *var_hash = var_hashx->first_dtor;
117-
118-
while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
119-
var_hash = var_hash->next;
120-
}
121-
122-
if (!var_hash || count <= 0) {
123-
return;
124-
}
125-
126-
for (i = count; i > 0; i--) {
127-
var_hash->used_slots--;
128-
if (var_hash->used_slots < 0) {
129-
var_hash->used_slots = 0;
130-
break;
131-
}
132-
}
133-
}
134-
135111
inline static zend_class_entry* msgpack_unserialize_class(
136112
zval **container, char *class_name, size_t name_len, zend_bool init_class)
137113
{
@@ -258,9 +234,6 @@ void msgpack_unserialize_var_destroy(msgpack_unserialize_data_t *var_hashx, zend
258234

259235
var_hash = var_hashx->first_dtor;
260236
while (var_hash) {
261-
for (i = var_hash->used_slots - 1; i >= 0; i--) {
262-
zval_ptr_dtor(&var_hash->data[i]);
263-
}
264237
next = var_hash->next;
265238
efree(var_hash);
266239
var_hash = next;
@@ -272,7 +245,7 @@ void msgpack_unserialize_set_return_value(msgpack_unserialize_data_t *var_hashx,
272245
if ((var_hash = var_hashx->first) != NULL) {
273246
ZVAL_COPY_VALUE(return_value, &var_hash->data[0]);
274247
} else if ((var_hash = var_hashx->first_dtor) != NULL) {
275-
ZVAL_COPY(return_value, &var_hash->data[0]);
248+
ZVAL_COPY_VALUE(return_value, &var_hash->data[0]);
276249
}
277250

278251
}
@@ -406,7 +379,7 @@ int msgpack_unserialize_raw(
406379
if (len == 0) {
407380
ZVAL_STRINGL(*obj, "", 0);
408381
} else {
409-
ZVAL_STRINGL(*obj, (char *)data, len);
382+
ZVAL_STRINGL(*obj, data, len);
410383
}
411384

412385
return 0;
@@ -574,8 +547,8 @@ int msgpack_unserialize_map_item(
574547
zend_unmangle_property_name_ex(key_zstring, &class_name, &prop_name, &prop_len);
575548
zend_update_property(Z_OBJCE_P(container_val), container_val, prop_name, prop_len, val);
576549

577-
zval_ptr_dtor(key);
578550
zend_string_release(key_zstring);
551+
zval_ptr_dtor(key);
579552
} else {
580553
switch (Z_TYPE_P(key)) {
581554
case IS_LONG:
@@ -617,8 +590,6 @@ int msgpack_unserialize_map_item(
617590
}
618591
}
619592

620-
msgpack_stack_pop(unpack->var_hash, 2);
621-
622593
deps = unpack->deps - 1;
623594
unpack->stack[deps]--;
624595
if (unpack->stack[deps] == 0)

0 commit comments

Comments
 (0)