Skip to content

Commit

Permalink
Ensure the internal properties cannot be overwritten
Browse files Browse the repository at this point in the history
  • Loading branch information
duncan3dc committed May 30, 2019
1 parent 5d67271 commit dc586bf
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 15 deletions.
37 changes: 34 additions & 3 deletions ext/date/php_date.c
Expand Up @@ -5310,12 +5310,35 @@ PHP_METHOD(DatePeriod, __wakeup)
}
/* }}} */

/* {{{ date_period_is_magic_property
* Common for date_period_read_property() and date_period_write_property() functions
*/
static int date_period_is_magic_property(zend_string *name)
{
if (zend_string_equals_literal(name, "recurrences")
|| zend_string_equals_literal(name, "include_start_date")
|| zend_string_equals_literal(name, "start")
|| zend_string_equals_literal(name, "current")
|| zend_string_equals_literal(name, "end")
|| zend_string_equals_literal(name, "interval")
) {
return 1;
}
return 0;
}
/* }}} */

/* {{{ date_period_read_property */
static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv)
{
if (type != BP_VAR_IS && type != BP_VAR_R) {
zend_throw_error(NULL, "Retrieval of DatePeriod properties for modification is unsupported");
return &EG(uninitialized_zval);
zend_string *name = zval_get_string(member);
if (date_period_is_magic_property(name)) {
zend_throw_error(NULL, "Retrieval of DatePeriod->%s for modification is unsupported", ZSTR_VAL(name));
zend_string_release(name);
return &EG(uninitialized_zval);
}
zend_string_release(name);
}

Z_OBJPROP_P(object); /* build properties hash table */
Expand All @@ -5327,7 +5350,15 @@ static zval *date_period_read_property(zval *object, zval *member, int type, voi
/* {{{ date_period_write_property */
static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot)
{
zend_throw_error(NULL, "Writing to DatePeriod properties is unsupported");
zend_string *name = zval_get_string(member);
if (date_period_is_magic_property(name)) {
zend_throw_error(NULL, "Writing to DatePeriod->%s is unsupported", ZSTR_VAL(name));
zend_string_release(name);
return;
}
zend_string_release(name);

std_object_handlers.write_property(object, member, value, cache_slot);
}
/* }}} */

Expand Down
24 changes: 12 additions & 12 deletions ext/date/tests/DatePeriod_properties2.phpt
Expand Up @@ -32,15 +32,15 @@ foreach ($properties as $property) {

?>
--EXPECT--
Writing to DatePeriod properties is unsupported
Retrieval of DatePeriod properties for modification is unsupported
Writing to DatePeriod properties is unsupported
Retrieval of DatePeriod properties for modification is unsupported
Writing to DatePeriod properties is unsupported
Retrieval of DatePeriod properties for modification is unsupported
Writing to DatePeriod properties is unsupported
Retrieval of DatePeriod properties for modification is unsupported
Writing to DatePeriod properties is unsupported
Retrieval of DatePeriod properties for modification is unsupported
Writing to DatePeriod properties is unsupported
Retrieval of DatePeriod properties for modification is unsupported
Writing to DatePeriod->recurrences is unsupported
Retrieval of DatePeriod->recurrences for modification is unsupported
Writing to DatePeriod->include_start_date is unsupported
Retrieval of DatePeriod->include_start_date for modification is unsupported
Writing to DatePeriod->start is unsupported
Retrieval of DatePeriod->start for modification is unsupported
Writing to DatePeriod->current is unsupported
Retrieval of DatePeriod->current for modification is unsupported
Writing to DatePeriod->end is unsupported
Retrieval of DatePeriod->end for modification is unsupported
Writing to DatePeriod->interval is unsupported
Retrieval of DatePeriod->interval for modification is unsupported

0 comments on commit dc586bf

Please sign in to comment.