diff options
author | Dmitry Stogov <dmitry@php.net> | 2006-01-16 10:12:36 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2006-01-16 10:12:36 +0000 |
commit | b8360c376b5d66f61821765b96c9fda522b13fa5 (patch) | |
tree | 6efca87768115fc638afafff28454ac3daee8f8e | |
parent | 4b1791a767099325b27c9e800f243a2132466ce3 (diff) | |
download | php-git-b8360c376b5d66f61821765b96c9fda522b13fa5.tar.gz |
Fixed bug #36006 (Problem with $this in __destruct())
-rw-r--r-- | NEWS | 1 | ||||
-rwxr-xr-x | Zend/tests/bug36006.phpt | 30 | ||||
-rw-r--r-- | Zend/zend_objects_API.c | 2 |
3 files changed, 33 insertions, 0 deletions
@@ -8,6 +8,7 @@ PHP NEWS - Fixed bug #36016 (realpath cache memleaks). (Dmitry, Nuno) - Fixed bug #36011 (Strict errormsg wrong for call_user_func() and the likes). (Marcus) +- Fixed bug #36006 (Problem with $this in __destruct()). (Dmitry) - Fixed bug #35998 (SplFileInfo::getPathname() returns unix style filenames in win32). (Marcus) 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-- +<?php + +class Person { + public $dad; + public function __destruct() { + $this->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 c47125de3d..0926c744c4 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--; } } } |