Skip to content

Commit 03a45b0

Browse files
committed
Ensure the internal properties cannot be overwritten
1 parent dfca0e5 commit 03a45b0

File tree

2 files changed

+74
-3
lines changed

2 files changed

+74
-3
lines changed

ext/date/php_date.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5314,8 +5314,19 @@ PHP_METHOD(DatePeriod, __wakeup)
53145314
static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv)
53155315
{
53165316
if (type != BP_VAR_IS && type != BP_VAR_R) {
5317-
zend_throw_error(NULL, "Retrieval of DatePeriod properties for modification is unsupported");
5318-
return &EG(uninitialized_zval);
5317+
zend_string *name = zval_get_string(member);
5318+
if (zend_string_equals_literal(name, "recurrences")
5319+
|| zend_string_equals_literal(name, "include_start_date")
5320+
|| zend_string_equals_literal(name, "start")
5321+
|| zend_string_equals_literal(name, "current")
5322+
|| zend_string_equals_literal(name, "end")
5323+
|| zend_string_equals_literal(name, "interval")
5324+
) {
5325+
zend_throw_error(NULL, "Retrieval of DatePeriod->%s for modification is unsupported", ZSTR_VAL(name));
5326+
zend_string_release(name);
5327+
return &EG(uninitialized_zval);
5328+
}
5329+
zend_string_release(name);
53195330
}
53205331

53215332
Z_OBJPROP_P(object); /* build properties hash table */
@@ -5327,7 +5338,21 @@ static zval *date_period_read_property(zval *object, zval *member, int type, voi
53275338
/* {{{ date_period_write_property */
53285339
static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot)
53295340
{
5330-
zend_throw_error(NULL, "Writing to DatePeriod properties is unsupported");
5341+
zend_string *name = zval_get_string(member);
5342+
if (zend_string_equals_literal(name, "recurrences")
5343+
|| zend_string_equals_literal(name, "include_start_date")
5344+
|| zend_string_equals_literal(name, "start")
5345+
|| zend_string_equals_literal(name, "current")
5346+
|| zend_string_equals_literal(name, "end")
5347+
|| zend_string_equals_literal(name, "interval")
5348+
) {
5349+
zend_throw_error(NULL, "Writing to DatePeriod->%s is unsupported", ZSTR_VAL(name));
5350+
zend_string_release(name);
5351+
return;
5352+
}
5353+
zend_string_release(name);
5354+
5355+
std_object_handlers.write_property(object, member, value, cache_slot);
53315356
}
53325357
/* }}} */
53335358

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
--TEST--
2+
DatePeriod: Test cannot modify read only properties
3+
--INI--
4+
date.timezone=UTC
5+
--FILE--
6+
<?php
7+
8+
$period = new DatePeriod(new DateTime, new DateInterval('P1D'), new DateTime);
9+
10+
$properties = [
11+
"recurrences",
12+
"include_start_date",
13+
"start",
14+
"current",
15+
"end",
16+
"interval",
17+
];
18+
19+
foreach ($properties as $property) {
20+
try {
21+
$period->$property = "new";
22+
} catch (Error $e) {
23+
echo $e->getMessage() . "\n";
24+
}
25+
26+
try {
27+
$period->$property[] = "extra";
28+
} catch (Error $e) {
29+
echo $e->getMessage() . "\n";
30+
}
31+
}
32+
33+
?>
34+
--EXPECT--
35+
Writing to DatePeriod->recurrences is unsupported
36+
Retrieval of DatePeriod->recurrences for modification is unsupported
37+
Writing to DatePeriod->include_start_date is unsupported
38+
Retrieval of DatePeriod->include_start_date for modification is unsupported
39+
Writing to DatePeriod->start is unsupported
40+
Retrieval of DatePeriod->start for modification is unsupported
41+
Writing to DatePeriod->current is unsupported
42+
Retrieval of DatePeriod->current for modification is unsupported
43+
Writing to DatePeriod->end is unsupported
44+
Retrieval of DatePeriod->end for modification is unsupported
45+
Writing to DatePeriod->interval is unsupported
46+
Retrieval of DatePeriod->interval for modification is unsupported

0 commit comments

Comments
 (0)