diff options
| -rw-r--r-- | ext/standard/tests/serialize/sleep_undefined_declared_properties.phpt | 29 | ||||
| -rw-r--r-- | ext/standard/var.c | 78 |
2 files changed, 72 insertions, 35 deletions
diff --git a/ext/standard/tests/serialize/sleep_undefined_declared_properties.phpt b/ext/standard/tests/serialize/sleep_undefined_declared_properties.phpt new file mode 100644 index 0000000000..ac33f4388c --- /dev/null +++ b/ext/standard/tests/serialize/sleep_undefined_declared_properties.phpt @@ -0,0 +1,29 @@ +--TEST-- +__sleep() returning undefined declared properties +--FILE-- +<?php + +class Test { + public $pub; + protected $prot; + private $priv; + + public function __construct() { + unset($this->pub, $this->prot, $this->priv); + } + + public function __sleep() { + return ['pub', 'prot', 'priv']; + } +} + +var_dump(serialize(new Test)); + +?> +--EXPECTF-- +Notice: serialize(): "pub" returned as member variable from __sleep() but does not exist in %s on line %d + +Notice: serialize(): "prot" returned as member variable from __sleep() but does not exist in %s on line %d + +Notice: serialize(): "priv" returned as member variable from __sleep() but does not exist in %s on line %d +string(53) "O:4:"Test":3:{s:3:"pub";N;s:4:"prot";N;s:4:"priv";N;}" diff --git a/ext/standard/var.c b/ext/standard/var.c index 1e1e94ac85..d6d17c2ec6 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -739,57 +739,65 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt propers = Z_OBJPROP_P(struc); ZEND_HASH_FOREACH_STR_KEY(&names, name) { + zend_string *prot_name, *priv_name; + zval *val = zend_hash_find(propers, name); if (val != NULL) { if (Z_TYPE_P(val) == IS_INDIRECT) { val = Z_INDIRECT_P(val); if (Z_TYPE_P(val) == IS_UNDEF) { - continue; + goto undef_prop; } } + php_var_serialize_string(buf, ZSTR_VAL(name), ZSTR_LEN(name)); php_var_serialize_intern(buf, val, var_hash); - } else { - zend_string *prot_name, *priv_name; - - priv_name = zend_mangle_property_name( - ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS); - val = zend_hash_find(propers, priv_name); - if (val != NULL) { - if (Z_TYPE_P(val) == IS_INDIRECT) { - val = Z_INDIRECT_P(val); - if (Z_ISUNDEF_P(val)) { - continue; - } + continue; + } + + priv_name = zend_mangle_property_name( + ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS); + val = zend_hash_find(propers, priv_name); + if (val != NULL) { + if (Z_TYPE_P(val) == IS_INDIRECT) { + val = Z_INDIRECT_P(val); + if (Z_ISUNDEF_P(val)) { + zend_string_free(priv_name); + goto undef_prop; } - php_var_serialize_string(buf, ZSTR_VAL(priv_name), ZSTR_LEN(priv_name)); - zend_string_free(priv_name); - php_var_serialize_intern(buf, val, var_hash); - continue; } + + php_var_serialize_string(buf, ZSTR_VAL(priv_name), ZSTR_LEN(priv_name)); zend_string_free(priv_name); - prot_name = zend_mangle_property_name( - "*", 1, ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS); - val = zend_hash_find(propers, prot_name); - if (val != NULL) { - if (Z_TYPE_P(val) == IS_INDIRECT) { - val = Z_INDIRECT_P(val); - if (Z_TYPE_P(val) == IS_UNDEF) { - zend_string_free(prot_name); - continue; - } + php_var_serialize_intern(buf, val, var_hash); + continue; + } + zend_string_free(priv_name); + + prot_name = zend_mangle_property_name( + "*", 1, ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS); + val = zend_hash_find(propers, prot_name); + if (val != NULL) { + if (Z_TYPE_P(val) == IS_INDIRECT) { + val = Z_INDIRECT_P(val); + if (Z_TYPE_P(val) == IS_UNDEF) { + zend_string_free(prot_name); + goto undef_prop; } - php_var_serialize_string(buf, ZSTR_VAL(prot_name), ZSTR_LEN(prot_name)); - zend_string_free(prot_name); - php_var_serialize_intern(buf, val, var_hash); - continue; } + + php_var_serialize_string(buf, ZSTR_VAL(prot_name), ZSTR_LEN(prot_name)); zend_string_free(prot_name); - php_var_serialize_string(buf, ZSTR_VAL(name), ZSTR_LEN(name)); - php_var_serialize_intern(buf, &nval, var_hash); - php_error_docref(NULL, E_NOTICE, - "\"%s\" returned as member variable from __sleep() but does not exist", ZSTR_VAL(name)); + php_var_serialize_intern(buf, val, var_hash); + continue; } + zend_string_free(prot_name); + +undef_prop: + php_var_serialize_string(buf, ZSTR_VAL(name), ZSTR_LEN(name)); + php_var_serialize_intern(buf, &nval, var_hash); + php_error_docref(NULL, E_NOTICE, + "\"%s\" returned as member variable from __sleep() but does not exist", ZSTR_VAL(name)); } ZEND_HASH_FOREACH_END(); smart_str_appendc(buf, '}'); |
