Merge branch 'PHP-5.6' into PHP-7.0
authorAnatol Belski <ab@php.net>
Tue, 8 Nov 2016 11:16:39 +0000 (12:16 +0100)
committerAnatol Belski <ab@php.net>
Tue, 8 Nov 2016 11:16:39 +0000 (12:16 +0100)
* PHP-5.6:
  fix memory leak

1  2 
ext/wddx/wddx.c

diff --cc ext/wddx/wddx.c
index e21d178edfff30a902779ec07b113d05d38e00d4,069ea122ce3b4993aa3a97da1e9f4ce96b7e47ba..b188e8929eff3b860c23075a0086135a29323dc9
@@@ -940,31 -1000,34 +940,32 @@@ static void php_wddx_pop_element(void *
  
                                if (ent1->varname) {
                                        if (!strcmp(ent1->varname, PHP_CLASS_NAME_VAR) &&
 -                                              Z_TYPE_P(ent1->data) == IS_STRING && Z_STRLEN_P(ent1->data) &&
 -                                              ent2->type == ST_STRUCT && Z_TYPE_P(ent2->data) == IS_ARRAY) {
 +                                              Z_TYPE(ent1->data) == IS_STRING && Z_STRLEN(ent1->data) &&
 +                                              ent2->type == ST_STRUCT && Z_TYPE(ent2->data) == IS_ARRAY) {
                                                zend_bool incomplete_class = 0;
  
 -                                              zend_str_tolower(Z_STRVAL_P(ent1->data), Z_STRLEN_P(ent1->data));
 -                                              if (zend_hash_find(EG(class_table), Z_STRVAL_P(ent1->data),
 -                                                                                 Z_STRLEN_P(ent1->data)+1, (void **) &pce)==FAILURE) {
 +                                              zend_str_tolower(Z_STRVAL(ent1->data), Z_STRLEN(ent1->data));
 +                                              zend_string_forget_hash_val(Z_STR(ent1->data));
 +                                              if ((pce = zend_hash_find_ptr(EG(class_table), Z_STR(ent1->data))) == NULL) {
                                                        incomplete_class = 1;
 -                                                      pce = &PHP_IC_ENTRY;
 +                                                      pce = PHP_IC_ENTRY;
                                                }
  
 -                                              if (pce != &PHP_IC_ENTRY && ((*pce)->serialize || (*pce)->unserialize)) {
 +                                              if (pce != PHP_IC_ENTRY && (pce->serialize || pce->unserialize)) {
+                                                       zval_ptr_dtor(&ent2->data);
 -                                                      ent2->data = NULL;
 -                                                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "Class %s can not be unserialized", Z_STRVAL_P(ent1->data));
 +                                                      ZVAL_UNDEF(&ent2->data);
 +                                                      php_error_docref(NULL, E_WARNING, "Class %s can not be unserialized", Z_STRVAL(ent1->data));
                                                } else {
                                                        /* Initialize target object */
 -                                                      MAKE_STD_ZVAL(obj);
 -                                                      object_init_ex(obj, *pce);
 +                                                      object_init_ex(&obj, pce);
  
                                                        /* Merge current hashtable with object's default properties */
 -                                                      zend_hash_merge(Z_OBJPROP_P(obj),
 -                                                                                      Z_ARRVAL_P(ent2->data),
 -                                                                                      (void (*)(void *)) zval_add_ref,
 -                                                                                      (void *) &tmp, sizeof(zval *), 0);
 +                                                      zend_hash_merge(Z_OBJPROP(obj),
 +                                                                                      Z_ARRVAL(ent2->data),
 +                                                                                      zval_add_ref, 0);
  
                                                        if (incomplete_class) {
 -                                                              php_store_class_name(obj, Z_STRVAL_P(ent1->data), Z_STRLEN_P(ent1->data));
 +                                                              php_store_class_name(&obj, Z_STRVAL(ent1->data), Z_STRLEN(ent1->data));
                                                        }
  
                                                        /* Clean up old array entry */