Fixed Bug #62500 (Segfault in DateInterval class when extended)

This fix also fixed bug #62508  (Segfault while access a non-string
property of DateInterval object)
This commit is contained in:
Xinchen Hui 2012-07-09 00:25:48 +08:00
parent a213c10ef2
commit e3b9b1e6dc
3 changed files with 50 additions and 0 deletions

3
NEWS
View File

@ -5,6 +5,9 @@ PHP NEWS
- SimpleXML:
. Implemented FR #55218 Get namespaces from current node. (Lonny)
- DateTime:
. Fixed Bug #62500 (Segfault in DateInterval class when extended). (Laruence)
?? ??? 2012, PHP 5.4.5
- Core:

View File

@ -3430,10 +3430,19 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze
zval_copy_ctor(&tmp_member);
convert_to_string(&tmp_member);
member = &tmp_member;
key = NULL;
}
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, key 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; \
@ -3482,9 +3491,19 @@ void date_interval_write_property(zval *object, zval *member, zval *value, const
zval_copy_ctor(&tmp_member);
convert_to_string(&tmp_member);
member = &tmp_member;
key = NULL;
}
obj = (php_interval_obj *)zend_objects_get_address(object TSRMLS_CC);
if (!obj->initialized) {
(zend_get_std_object_handlers())->write_property(object, member, value, key 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) { \

View File

@ -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)"