cvs: ZendEngine2(PHP_5_3) / zend_object_handlers.c /tests bug46308.phpt

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1224239167@cvsserver>
dmitry		Fri Oct 17 10:26:07 2008 UTC

  Added files:                 (Branch: PHP_5_3)
    /ZendEngine2/tests	bug46308.phpt 

  Modified files:              
    /ZendEngine2	zend_object_handlers.c 
  Log:
  Fixed bug #46308 (Invalid write when changing property from inside getter)
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.c?r1=1.135.2.6.2.22.2.20&r2=1.135.2.6.2.22.2.21&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.20 ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.21
--- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.20	Thu Aug 14 21:36:56 2008
+++ ZendEngine2/zend_object_handlers.c	Fri Oct 17 10:26:07 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_object_handlers.c,v 1.135.2.6.2.22.2.20 2008/08/14 21:36:56 colder Exp $ */
+/* $Id: zend_object_handlers.c,v 1.135.2.6.2.22.2.21 2008/10/17 10:26:07 dmitry Exp $ */
 
 #include "zend.h"
 #include "zend_globals.h"
@@ -345,6 +345,7 @@
 		    zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS &&
 		    !guard->in_get) {
 			/* have getter - try with it! */
+			Z_ADDREF_P(object);
 			guard->in_get = 1; /* prevent circular getting */
 			rv = zend_std_call_getter(object, member TSRMLS_CC);
 			guard->in_get = 0;
@@ -369,6 +370,7 @@
 			} else {
 				retval = &EG(uninitialized_zval_ptr);
 			}
+			zval_ptr_dtor(&object);
 		} else {
 			if (!silent) {
 				zend_error(E_NOTICE,"Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member));
@@ -439,12 +441,14 @@
 		if (zobj->ce->__set &&
 		    zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS &&
 		    !guard->in_set) {
+			Z_ADDREF_P(object);
 			guard->in_set = 1; /* prevent circular setting */
 			if (zend_std_call_setter(object, member, value TSRMLS_CC) != SUCCESS) {
 				/* for now, just ignore it - __set should take care of warnings, etc. */
 			}
 			setter_done = 1;
 			guard->in_set = 0;
+			zval_ptr_dtor(&object);
 		}
 		if (!setter_done && property_info) {
 			zval **foo;
@@ -620,9 +624,11 @@
 		    zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS &&
 		    !guard->in_unset) {
 			/* have unseter - try with it! */
+			Z_ADDREF_P(object);
 			guard->in_unset = 1; /* prevent circular unsetting */
 			zend_std_call_unsetter(object, member TSRMLS_CC);
 			guard->in_unset = 0;
+			zval_ptr_dtor(&object);
 		}
 	}
 
@@ -1117,6 +1123,7 @@
 			zval *rv;
 
 			/* have issetter - try with it! */
+			Z_ADDREF_P(object);
 			guard->in_isset = 1; /* prevent circular getting */
 			rv = zend_std_call_issetter(object, member TSRMLS_CC);
 			if (rv) {
@@ -1140,6 +1147,7 @@
 				}
 			}
 			guard->in_isset = 0;
+			zval_ptr_dtor(&object);
 		}
 	} else {
 		switch (has_set_exists) {

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug46308.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug46308.phpt
+++ ZendEngine2/tests/bug46308.phpt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.