cvs: ZendEngine2 / zend_object_handlers.c /tests bug46308.phpt

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

  Modified files:              
    /ZendEngine2	zend_object_handlers.c 
    /ZendEngine2/tests	bug46308.phpt 
  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.205&r2=1.206&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.205 ZendEngine2/zend_object_handlers.c:1.206
--- ZendEngine2/zend_object_handlers.c:1.205	Thu Aug 14 21:26:05 2008
+++ ZendEngine2/zend_object_handlers.c	Fri Oct 17 10:26:16 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_object_handlers.c,v 1.205 2008/08/14 21:26:05 colder Exp $ */
+/* $Id: zend_object_handlers.c,v 1.206 2008/10/17 10:26:16 dmitry Exp $ */
 
 #include "zend.h"
 #include "zend_globals.h"
@@ -353,6 +353,7 @@
 		    zend_get_property_guard(zobj, property_info, member, &guard TSRMLS_CC) == 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;
@@ -377,6 +378,7 @@
 			} else {
 				retval = &EG(uninitialized_zval_ptr);
 			}
+			zval_ptr_dtor(&object);
 		} else {
 			if (!silent) {
 				zend_error(E_NOTICE,"Undefined property: %v::$%R", zobj->ce->name, Z_TYPE_P(member), Z_STRVAL_P(member));
@@ -447,12 +449,14 @@
 		if (zobj->ce->__set &&
 		    zend_get_property_guard(zobj, property_info, member, &guard TSRMLS_CC) == 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;
@@ -628,9 +632,11 @@
 		    zend_get_property_guard(zobj, property_info, member, &guard TSRMLS_CC) == 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);
 		}
 	}
 
@@ -1146,6 +1152,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) {
@@ -1169,6 +1176,7 @@
 				}
 			}
 			guard->in_isset = 0;
+			zval_ptr_dtor(&object);
 		}
 	} else {
 		switch (has_set_exists) {
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug46308.phpt?r1=1.1&r2=1.2&diff_format=u
Index: ZendEngine2/tests/bug46308.phpt
diff -u /dev/null ZendEngine2/tests/bug46308.phpt:1.2
--- /dev/null	Fri Oct 17 10:26:16 2008
+++ ZendEngine2/tests/bug46308.phpt	Fri Oct 17 10:26:16 2008
@@ -0,0 +1,33 @@
+--TEST--
+Bug #46308 (Invalid write when changing property from inside getter)
+--FILE--
+<?php
+class main
+{
+   public static $dummy        = NULL ;
+   public static $dataAccessor = NULL ;
+}
+
+class dataAccessor
+{
+}
+
+class relay
+{
+   public function __get( $name )
+   {
+       main::$dataAccessor = new dataAccessor;
+   }
+}
+
+class dummy
+{
+}
+
+main::$dummy        = new dummy();
+main::$dataAccessor = new relay();
+main::$dataAccessor->bar;
+echo "ok\n";
+?>
+--EXPECT--
+ok
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.