From: Dmitry Stogov Date: Wed, 1 Jun 2005 11:03:58 +0000 (+0000) Subject: Fixed bug #30791 (magic methods (__sleep/__wakeup/__toString) call __call if object... X-Git-Tag: php-5.0.1b1~118 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9383e1b8582ae678dd8769d79c0fb4122d0f5e43;p=php Fixed bug #30791 (magic methods (__sleep/__wakeup/__toString) call __call if object is overloaded) --- diff --git a/Zend/tests/bug30791.phpt b/Zend/tests/bug30791.phpt new file mode 100755 index 0000000000..f56bcfb6e7 --- /dev/null +++ b/Zend/tests/bug30791.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #30791 magic methods (__sleep/__wakeup/__toString) call __call if object is overloaded +--FILE-- + +--EXPECT-- +Object id #1 +Object id #2 +object(a)#2 (1) { + ["a"]=> + int(4) +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 48b9b9106b..e64b02e43b 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -892,6 +892,9 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty switch (type) { case IS_STRING: + if (!zend_hash_exists(&Z_OBJCE_P(readobj)->function_table, "__tostring", sizeof("__tostring"))) { + return FAILURE; + } ZVAL_STRING(&fname, "__tostring", 0); if (call_user_function_ex(NULL, &readobj, &fname, &retval, 0, NULL, 0, NULL TSRMLS_CC) == SUCCESS) { if (retval) { diff --git a/ext/standard/var.c b/ext/standard/var.c index 21605d21b9..fd92046ae6 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -696,7 +696,8 @@ static void php_var_serialize_intern(smart_str *buf, zval **struc, HashTable *va return; } - if(Z_OBJCE_PP(struc) != PHP_IC_ENTRY) { + if (Z_OBJCE_PP(struc) != PHP_IC_ENTRY && + zend_hash_exists(&Z_OBJCE_PP(struc)->function_table, "__sleep", sizeof("__sleep"))) { INIT_PZVAL(&fname); ZVAL_STRINGL(&fname, "__sleep", sizeof("__sleep") - 1, 0); res = call_user_function_ex(CG(function_table), struc, &fname, diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 9580a51458..bf81456a95 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -325,7 +325,8 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, long elements) return 0; } - if(Z_OBJCE_PP(rval) != PHP_IC_ENTRY) { + if (Z_OBJCE_PP(rval) != PHP_IC_ENTRY && + zend_hash_exists(&Z_OBJCE_PP(rval)->function_table, "__wakeup", sizeof("__wakeup"))) { INIT_PZVAL(&fname); ZVAL_STRINGL(&fname, "__wakeup", sizeof("__wakeup") - 1, 0); call_user_function_ex(CG(function_table), rval, &fname, &retval_ptr, 0, 0, 1, NULL TSRMLS_CC); diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 69b7307013..6b9e66715c 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -329,7 +329,8 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, long elements) return 0; } - if(Z_OBJCE_PP(rval) != PHP_IC_ENTRY) { + if (Z_OBJCE_PP(rval) != PHP_IC_ENTRY && + zend_hash_exists(&Z_OBJCE_PP(rval)->function_table, "__wakeup", sizeof("__wakeup"))) { INIT_PZVAL(&fname); ZVAL_STRINGL(&fname, "__wakeup", sizeof("__wakeup") - 1, 0); call_user_function_ex(CG(function_table), rval, &fname, &retval_ptr, 0, 0, 1, NULL TSRMLS_CC);