]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorCraig Duncan <duncan3dc@php.net>
Thu, 30 May 2019 18:15:58 +0000 (19:15 +0100)
committerCraig Duncan <duncan3dc@php.net>
Thu, 30 May 2019 18:15:58 +0000 (19:15 +0100)
* PHP-7.4:
  Add a test for bug #65672
  Ensure the internal properties cannot be overwritten

1  2 
ext/date/php_date.c

index e995b45341af8924f8dfd59ca9f745b533d287be,f7db8a26d78fe1760e3f3521bf67664908f562e7..7e040585859b69a0fd58916230fb9a40cf62acb4
@@@ -5264,24 -5324,55 +5264,55 @@@ 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)
 +static zval *date_period_read_property(zend_object *object, zend_string *name, 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 */
 +      object->handlers->get_properties(object); /* build properties hash table */
  
 -      return zend_std_read_property(object, member, type, cache_slot, rv);
 +      return zend_std_read_property(object, name, type, cache_slot, rv);
  }
  /* }}} */
  
  /* {{{ date_period_write_property */
 -static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot)
 +static zval *date_period_write_property(zend_object *object, zend_string *name, 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 value;
+       }
+       zend_string_release(name);
+       std_object_handlers.write_property(object, member, value, cache_slot);
        return value;
  }
  /* }}} */