Skip to content

Commit 3866934

Browse files
committed
Update msgpack_convert_long_to_properties to properly detect keys
1 parent db405c4 commit 3866934

File tree

3 files changed

+19
-29
lines changed

3 files changed

+19
-29
lines changed

msgpack.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,19 +124,15 @@ static ZEND_MINFO_FUNCTION(msgpack)
124124
}
125125

126126
zend_module_entry msgpack_module_entry = {
127-
#if ZEND_MODULE_API_NO >= 20010901
128127
STANDARD_MODULE_HEADER,
129-
#endif
130128
"msgpack",
131129
msgpack_functions,
132130
ZEND_MINIT(msgpack),
133131
ZEND_MSHUTDOWN(msgpack),
134132
NULL,
135133
NULL,
136134
ZEND_MINFO(msgpack),
137-
#if ZEND_MODULE_API_NO >= 20010901
138135
PHP_MSGPACK_VERSION,
139-
#endif
140136
STANDARD_MODULE_PROPERTIES
141137
};
142138

@@ -192,13 +188,12 @@ PS_SERIALIZER_DECODE_FUNC(msgpack)
192188
//unhandled non-string key
193189
}
194190
} ZEND_HASH_FOREACH_END();
191+
zval_ptr_dtor(&tmp);
195192
}
196193
else {
197194
msgpack_unserialize_var_destroy(&var_hash, 1);
198195
}
199196

200-
zval_ptr_dtor(&tmp);
201-
202197
return SUCCESS;
203198
}
204199
#endif
@@ -309,6 +304,6 @@ static ZEND_FUNCTION(msgpack_unserialize)
309304
if (msgpack_convert_template(return_value, object, &zv_p) != SUCCESS) {
310305
RETURN_NULL();
311306
}
312-
zval_ptr_dtor(object);
307+
313308
}
314309
}

msgpack_convert.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,19 @@ inline int msgpack_convert_long_to_properties(
1111
{
1212
if (*properties != NULL) {
1313
zval *data, tplval, *dataval, prop_key_zv;
14-
zend_string *prop_key;
14+
zend_string *prop_key, *unmangled_prop_key;
1515
ulong prop_key_index;
1616
const char *class_name, *prop_name;
1717
size_t prop_len;
1818

1919
for (;; zend_hash_move_forward_ex(*properties, prop_pos)) {
2020
if (zend_hash_get_current_key_ex(*properties, &prop_key, &prop_key_index, prop_pos) == HASH_KEY_IS_STRING) {
2121
zend_unmangle_property_name_ex(prop_key, &class_name, &prop_name, &prop_len);
22+
ZVAL_NEW_STR(&prop_key_zv, prop_key);
23+
unmangled_prop_key = zend_string_init(prop_name, prop_len, 0);
2224

23-
if (var == NULL || !zend_hash_exists(var, prop_key)) {
25+
if (var == NULL || !zend_hash_exists(var, unmangled_prop_key)) {
2426
if ((data = zend_hash_find(ht, prop_key)) != NULL) {
25-
prop_key = zend_string_init(prop_name, prop_len, 0);
26-
ZVAL_NEW_STR(&prop_key_zv, prop_key);
27-
2827
switch (Z_TYPE_P(data)) {
2928
case IS_ARRAY:
3029
{
@@ -35,40 +34,40 @@ inline int msgpack_convert_long_to_properties(
3534
MSGPACK_WARNING("[msgpack] (%s) "
3635
"can't get data value by index",
3736
__FUNCTION__);
38-
zend_string_release(prop_key);
37+
zend_string_release(unmangled_prop_key);
3938
return FAILURE;
4039
}
4140

4241
if (msgpack_convert_array(&tplval, data, &dataval) == SUCCESS) {
4342
zend_hash_move_forward_ex(*properties, prop_pos);
4443

4544
zend_update_property(Z_OBJCE_P(object), object, prop_name, prop_len, &tplval);
46-
zend_string_release(prop_key);
45+
zend_string_release(unmangled_prop_key);
4746
return SUCCESS;
4847
}
49-
zend_string_release(prop_key);
48+
zend_string_release(unmangled_prop_key);
5049
return FAILURE;
5150
}
5251
case IS_OBJECT:
5352
{
5453
if (msgpack_convert_object(&tplval, data, &val) == SUCCESS) {
5554
zend_hash_move_forward_ex(*properties, prop_pos);
5655
zend_update_property(Z_OBJCE_P(object), object, prop_name, prop_len, &tplval);
57-
zend_string_release(prop_key);
56+
zend_string_release(unmangled_prop_key);
5857
return SUCCESS;
5958
}
60-
zend_string_release(prop_key);
59+
zend_string_release(unmangled_prop_key);
6160
return FAILURE;
6261
}
6362
default:
6463
zend_hash_move_forward_ex(*properties, prop_pos);
6564
zend_update_property(Z_OBJCE_P(object), object, prop_name, prop_len, val);
66-
zend_string_release(prop_key);
65+
zend_string_release(unmangled_prop_key);
6766
return SUCCESS;
6867
}
6968
}
7069
}
71-
zend_string_release(prop_key);
70+
zend_string_release(unmangled_prop_key);
7271
} else {
7372
break;
7473
}
@@ -345,9 +344,8 @@ int msgpack_convert_object(zval *return_value, zval *tpl, zval **value) {
345344
if (Z_TYPE_P(*value) == IS_OBJECT) {
346345
zend_class_entry *vce;
347346

348-
vce = Z_OBJCE_P(tpl);
349-
if (strcmp(ce->name->val, vce->name->val) == 0)
350-
{
347+
vce = Z_OBJCE_P(*value);
348+
if (zend_string_equals(ce->name, vce->name)) {
351349
*return_value = **value;
352350
zval_copy_ctor(return_value);
353351
zval_ptr_dtor(*value);

msgpack_unpack.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -544,15 +544,12 @@ int msgpack_unserialize_map_item(
544544
}
545545

546546
*container = rval;
547-
548-
549-
if (type == MSGPACK_SERIALIZE_TYPE_OBJECT) {
550-
ZVAL_UNREF(*container);
551-
} else if (type == MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE) {
547+
if (type == MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE) {
552548
ZVAL_MAKE_REF(*container);
553549
}
554-
555-
if (Z_REFCOUNTED_P(*container)) Z_TRY_ADDREF_P(*container);
550+
if (Z_REFCOUNTED_P(*container)) {
551+
Z_TRY_ADDREF_P(*container);
552+
}
556553

557554

558555
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);

0 commit comments

Comments
 (0)