summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-06-06 10:38:43 +0000
committerDmitry Stogov <dmitry@php.net>2005-06-06 10:38:43 +0000
commitce23692663fe377111d79bc03cba88c21626841c (patch)
treeaf61a83ebda24f40a840c1a1fad8b7e60cfe5872
parente5d3e078621018b01a5c0ee443a9547ab41754a7 (diff)
downloadphp-git-ce23692663fe377111d79bc03cba88c21626841c.tar.gz
Fixed bug #32799 (crash: calling the corresponding global var during the destruct)
-rwxr-xr-xZend/tests/bug32799.phpt21
-rw-r--r--Zend/zend_objects_API.c2
2 files changed, 23 insertions, 0 deletions
diff --git a/Zend/tests/bug32799.phpt b/Zend/tests/bug32799.phpt
new file mode 100755
index 0000000000..7b09a50274
--- /dev/null
+++ b/Zend/tests/bug32799.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #32799 (crash: calling the corresponding global var during the destruct)
+--FILE--
+<?php
+class test{
+ public $c=1;
+ function __destruct (){
+ $GLOBALS['p']->c++; // no warning
+ print $GLOBALS['p']->c."\n"; // segfault
+ var_dump($GLOBALS['p']);
+ }
+}
+$p=new test;
+$p=null; //destroy the object by a new assignment (segfault)
+?>
+--EXPECT--
+2
+object(test)#1 (1) {
+ ["c"]=>
+ int(2)
+}
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index 6aa2d80b56..d37b4976e8 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -151,7 +151,9 @@ ZEND_API void zend_objects_store_del_ref(zval *zobject TSRMLS_DC)
EG(objects_store).object_buckets[handle].destructor_called = 1;
if (obj->dtor) {
+ zobject->refcount++;
obj->dtor(obj->object, handle TSRMLS_CC);
+ zobject->refcount--;
}
}
if (obj->refcount == 1) {