From c93396ae1adc14a07c8fc21d5c239a5aaeb57d73 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 16 Jan 2006 10:12:54 +0000 Subject: [PATCH] Fixed bug #36006 (Problem with $this in __destruct()) --- Zend/tests/bug36006.phpt | 30 ++++++++++++++++++++++++++++++ Zend/zend_objects_API.c | 2 ++ 2 files changed, 32 insertions(+) create mode 100755 Zend/tests/bug36006.phpt diff --git a/Zend/tests/bug36006.phpt b/Zend/tests/bug36006.phpt new file mode 100755 index 0000000000..79f9897d13 --- /dev/null +++ b/Zend/tests/bug36006.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #36006 (Problem with $this in __destruct()) +--FILE-- +dad = null; /* no segfault if this is commented out */ + } +} + +class Dad extends Person { + public $son; + public function __construct() { + $this->son = new Person; + $this->son->dad = $this; /* no segfault if this is commented out */ + } + public function __destruct() { + $this->son = null; + parent::__destruct(); /* segfault here */ + } +} + +$o = new Dad; +unset($o); +echo "ok\n"; +?> +--EXPECT-- +ok diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 59e7b3317b..e7084f013b 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -52,7 +52,9 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS if (!objects->object_buckets[i].destructor_called) { objects->object_buckets[i].destructor_called = 1; if (obj->dtor && obj->object) { + obj->refcount++; obj->dtor(obj->object, i TSRMLS_CC); + obj->refcount--; } } } -- 2.40.0