From a08a1ae2c05176e356b0dbb9eec14b10acea8551 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 13 May 2014 17:27:37 +0400 Subject: [PATCH] Fixed reference counting, IS_REFERENCE and IS_INDIRECT support --- ext/wddx/wddx.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index fd22262c86..8b46910152 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -296,14 +296,20 @@ PS_SERIALIZER_DECODE_FUNC(wddx) return SUCCESS; } + ZVAL_UNDEF(&retval); if ((ret = php_wddx_deserialize_ex(val, vallen, &retval)) == SUCCESS) { ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(retval), idx, key, ent) { if (key == NULL) { key = STR_ALLOC(MAX_LENGTH_OF_LONG, 0); key->len = snprintf(key->val, key->len + 1, "%ld", idx); + } else { + STR_ADDREF(key); + } + if (php_set_session_var(key, ent, NULL TSRMLS_CC)) { + if (Z_REFCOUNTED_P(ent)) Z_ADDREF_P(ent); } - php_set_session_var(key, ent, NULL TSRMLS_CC); PS_ADD_VAR(key); + STR_RELEASE(key); } ZEND_HASH_FOREACH_END(); } @@ -600,6 +606,10 @@ void php_wddx_serialize_var(wddx_packet *packet, zval *var, zend_string *name TS STR_RELEASE(name_esc); } + if (Z_TYPE_P(var) == IS_INDIRECT) { + var = Z_INDIRECT_P(var); + } + ZVAL_DEREF(var); switch (Z_TYPE_P(var)) { case IS_STRING: php_wddx_serialize_string(packet, var TSRMLS_CC); @@ -938,8 +948,8 @@ static void php_wddx_pop_element(void *user_data, const XML_Char *name) zend_class_entry *old_scope = EG(scope); EG(scope) = Z_OBJCE(ent2->data); - zval_ptr_dtor(&ent1->data); add_property_zval(&ent2->data, ent1->varname, &ent1->data); + if Z_REFCOUNTED(ent1->data) Z_DELREF(ent1->data); EG(scope) = old_scope; } else { zend_symtable_str_update(target_hash, ent1->varname, strlen(ent1->varname), &ent1->data); -- 2.40.0