Skip to content

Commit d8881f4

Browse files
committed
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: Fix array access on undeclared properties in DateInterval
2 parents dc3b9fe + f48abfa commit d8881f4

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

ext/date/php_date.c

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,7 @@ static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n
658658

659659
zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
660660
void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot);
661+
static zval *date_interval_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot);
661662
static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
662663
static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot);
663664

@@ -2129,7 +2130,7 @@ static void date_register_classes(void) /* {{{ */
21292130
date_object_handlers_interval.read_property = date_interval_read_property;
21302131
date_object_handlers_interval.write_property = date_interval_write_property;
21312132
date_object_handlers_interval.get_properties = date_object_get_properties_interval;
2132-
date_object_handlers_interval.get_property_ptr_ptr = NULL;
2133+
date_object_handlers_interval.get_property_ptr_ptr = date_interval_get_property_ptr_ptr;
21332134
date_object_handlers_interval.get_gc = date_object_get_gc_interval;
21342135

21352136
INIT_CLASS_ENTRY(ce_period, "DatePeriod", date_funcs_period);
@@ -4215,6 +4216,40 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void
42154216
}
42164217
/* }}} */
42174218

4219+
/* {{{ date_interval_get_property_ptr_ptr */
4220+
static zval *date_interval_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot)
4221+
{
4222+
zval tmp_member, *ret;
4223+
4224+
if (Z_TYPE_P(member) != IS_STRING) {
4225+
tmp_member = *member;
4226+
zval_copy_ctor(&tmp_member);
4227+
convert_to_string(&tmp_member);
4228+
member = &tmp_member;
4229+
cache_slot = NULL;
4230+
}
4231+
4232+
if(zend_binary_strcmp("y", sizeof("y") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4233+
zend_binary_strcmp("m", sizeof("m") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4234+
zend_binary_strcmp("d", sizeof("d") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4235+
zend_binary_strcmp("h", sizeof("h") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4236+
zend_binary_strcmp("i", sizeof("i") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4237+
zend_binary_strcmp("s", sizeof("s") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4238+
zend_binary_strcmp("days", sizeof("days") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0 ||
4239+
zend_binary_strcmp("invert", sizeof("invert") - 1, Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0) {
4240+
/* Fallback to read_property. */
4241+
ret = NULL;
4242+
} else {
4243+
ret = (zend_get_std_object_handlers())->get_property_ptr_ptr(object, member, type, cache_slot);
4244+
}
4245+
4246+
if (member == &tmp_member) {
4247+
zval_dtor(member);
4248+
}
4249+
4250+
return ret;
4251+
}
4252+
/* }}} */
42184253

42194254
/* {{{ proto DateInterval::__construct([string interval_spec])
42204255
Creates new DateInterval object.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Test DateInterval props with dimension handling
3+
--FILE--
4+
<?php
5+
class Z extends DateInterval{}
6+
$z = new Z('P2Y4DT6H8M');
7+
$i = 0;
8+
$z->prop[1]=10;
9+
while ($i < 1026) {
10+
$z->prop[$i] = $i;
11+
$i++;
12+
}
13+
?>
14+
==NOCRASH==
15+
--EXPECT--
16+
==NOCRASH==

0 commit comments

Comments
 (0)