diff options
author | Xinchen Hui <laruence@php.net> | 2012-07-10 18:43:11 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2012-07-10 18:43:11 +0800 |
commit | bcf5853eaa8b8be793d4a1bd325eaea68cfe57bb (patch) | |
tree | 29d8e34e7bac5427d53f8b7993e41b3ceb299c0f /ext/date | |
parent | c819cf9d6bd43d79b894f1d0f0c6c282893fd9bd (diff) | |
download | php-git-bcf5853eaa8b8be793d4a1bd325eaea68cfe57bb.tar.gz |
Fixed Bug #62500 (Segfault in DateInterval class when extended)
Diffstat (limited to 'ext/date')
-rw-r--r-- | ext/date/php_date.c | 17 | ||||
-rw-r--r-- | ext/date/tests/bug62500.phpt | 28 |
2 files changed, 45 insertions, 0 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 527894d223..e8a457052e 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3511,6 +3511,14 @@ zval *date_interval_read_property(zval *object, zval *member, int type TSRMLS_DC obj = (php_interval_obj *)zend_objects_get_address(object TSRMLS_CC); + if (!obj->initialized) { + retval = (zend_get_std_object_handlers())->read_property(object, member, type TSRMLS_CC); + if (member == &tmp_member) { + zval_dtor(member); + } + return retval; + } + #define GET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ value = obj->diff->n; \ @@ -3560,8 +3568,17 @@ void date_interval_write_property(zval *object, zval *member, zval *value TSRMLS convert_to_string(&tmp_member); member = &tmp_member; } + obj = (php_interval_obj *)zend_objects_get_address(object TSRMLS_CC); + if (!obj->initialized) { + (zend_get_std_object_handlers())->write_property(object, member, value TSRMLS_CC); + if (member == &tmp_member) { + zval_dtor(member); + } + return; + } + #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ if (value->type != IS_LONG) { \ diff --git a/ext/date/tests/bug62500.phpt b/ext/date/tests/bug62500.phpt new file mode 100644 index 0000000000..6952332014 --- /dev/null +++ b/ext/date/tests/bug62500.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #62500 (Segfault in DateInterval class when extended) +--INI-- +date.timezone=GMT +--FILE-- +<?php +class Crasher extends DateInterval { + public $foo; + public function __construct($time_spec) { + var_dump($this->foo); + $this->foo = 3; + var_dump($this->foo); + var_dump($this->{2}); + parent::__construct($time_spec); + } +} +try { + $c = new Crasher('blah'); +} catch (Exception $e) { + var_dump($e->getMessage()); +} +--EXPECTF-- +NULL +int(3) + +Notice: Undefined property: Crasher::$2 in %sbug62500.php on line %d +NULL +string(%s) "DateInterval::__construct(): Unknown or bad format (blah)" |