summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe <krakjoe@php.net>2018-02-12 09:17:56 +0100
committerJoe <krakjoe@php.net>2018-02-12 09:19:11 +0100
commit8c1147b0891ca2c445eb4d8e5aefe8d000c1e7ae (patch)
tree89eeee14b1bf73228cc45791346eeef17406f45c
parent7554fd9101a84b3dbf3e25870a15a26ab73e1d70 (diff)
parent070211b3e3b2fc20247e761e3bf2a81b50b6e007 (diff)
downloadphp-git-8c1147b0891ca2c445eb4d8e5aefe8d000c1e7ae.tar.gz
Merge branch 'PHP-7.1' into PHP-7.2
* PHP-7.1: Fixed bug #68406 calling var_dump on a DateTimeZone object modifies it
-rw-r--r--NEWS2
-rw-r--r--ext/date/php_date.c41
-rw-r--r--ext/date/tests/DateTimeZone_clone_basic3.phpt32
-rw-r--r--ext/date/tests/bug68406.phpt34
4 files changed, 93 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index e6e9ba9540..f070163a72 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,8 @@ PHP NEWS
. Fixed bug #75857 (Timezone gets truncated when formatted). (carusogabriel)
. Fixed bug #75928 (Argument 2 for `DateTimeZone::listIdentifiers()` should
accept `null`). (Pedro Lacerda)
+ . Fixed bug #68406 (calling var_dump on a DateTimeZone object modifies it).
+ (jhdxr)
- LDAP:
. Fixed bug #49876 (Fix LDAP path lookup on 64-bit distros). (dzuelke)
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 092950a306..82ac9a6502 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -656,6 +656,7 @@ static HashTable *date_object_get_gc_period(zval *object, zval **table, int *n);
static HashTable *date_object_get_properties_period(zval *object);
static HashTable *date_object_get_properties_timezone(zval *object);
static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n);
+static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp);
zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot);
@@ -2120,6 +2121,7 @@ static void date_register_classes(void) /* {{{ */
date_object_handlers_timezone.clone_obj = date_object_clone_timezone;
date_object_handlers_timezone.get_properties = date_object_get_properties_timezone;
date_object_handlers_timezone.get_gc = date_object_get_gc_timezone;
+ date_object_handlers_timezone.get_debug_info = date_object_get_debug_info_timezone;
#define REGISTER_TIMEZONE_CLASS_CONST_STRING(const_name, value) \
zend_declare_class_constant_long(date_ce_timezone, const_name, sizeof(const_name)-1, value);
@@ -2397,6 +2399,45 @@ static HashTable *date_object_get_properties_timezone(zval *object) /* {{{ */
return props;
} /* }}} */
+static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp) /* {{{ */
+{
+ HashTable *ht, *props;
+ zval zv;
+ php_timezone_obj *tzobj;
+
+ tzobj = Z_PHPTIMEZONE_P(object);
+ props = zend_std_get_properties(object);
+
+ *is_temp = 1;
+ ht = zend_array_dup(props);
+
+ ZVAL_LONG(&zv, tzobj->type);
+ zend_hash_str_update(ht, "timezone_type", sizeof("timezone_type")-1, &zv);
+
+ switch (tzobj->type) {
+ case TIMELIB_ZONETYPE_ID:
+ ZVAL_STRING(&zv, tzobj->tzi.tz->name);
+ break;
+ case TIMELIB_ZONETYPE_OFFSET: {
+ zend_string *tmpstr = zend_string_alloc(sizeof("UTC+05:00")-1, 0);
+
+ ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), sizeof("+05:00"), "%c%02d:%02d",
+ tzobj->tzi.utc_offset > 0 ? '-' : '+',
+ abs(tzobj->tzi.utc_offset / 60),
+ abs((tzobj->tzi.utc_offset % 60)));
+
+ ZVAL_NEW_STR(&zv, tmpstr);
+ }
+ break;
+ case TIMELIB_ZONETYPE_ABBR:
+ ZVAL_STRING(&zv, tzobj->tzi.z.abbr);
+ break;
+ }
+ zend_hash_str_update(ht, "timezone", sizeof("timezone")-1, &zv);
+
+ return ht;
+} /* }}} */
+
static inline zend_object *date_object_new_interval_ex(zend_class_entry *class_type, int init_props) /* {{{ */
{
php_interval_obj *intern;
diff --git a/ext/date/tests/DateTimeZone_clone_basic3.phpt b/ext/date/tests/DateTimeZone_clone_basic3.phpt
index 128c8ff40b..f9be4e417e 100644
--- a/ext/date/tests/DateTimeZone_clone_basic3.phpt
+++ b/ext/date/tests/DateTimeZone_clone_basic3.phpt
@@ -39,34 +39,30 @@ object(DateTimeZone)#%d (2) {
-- Add some properties --
object(DateTimeZone)#%d (4) {
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(13) "Europe/London"
["property1"]=>
int(99)
["property2"]=>
string(5) "Hello"
-}
-
--- clone it --
-object(DateTimeZone)#%d (4) {
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/London"
+}
+
+-- clone it --
+object(DateTimeZone)#%d (4) {
["property1"]=>
int(99)
["property2"]=>
string(5) "Hello"
-}
-
--- Add some more properties --
-object(DateTimeZone)#%d (6) {
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/London"
+}
+
+-- Add some more properties --
+object(DateTimeZone)#%d (6) {
["property1"]=>
int(99)
["property2"]=>
@@ -75,14 +71,14 @@ object(DateTimeZone)#%d (6) {
bool(true)
["property4"]=>
float(10.5)
-}
-
--- clone it --
-object(DateTimeZone)#%d (6) {
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/London"
+}
+
+-- clone it --
+object(DateTimeZone)#%d (6) {
["property1"]=>
int(99)
["property2"]=>
@@ -91,5 +87,9 @@ object(DateTimeZone)#%d (6) {
bool(true)
["property4"]=>
float(10.5)
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(13) "Europe/London"
}
===DONE===
diff --git a/ext/date/tests/bug68406.phpt b/ext/date/tests/bug68406.phpt
new file mode 100644
index 0000000000..a6a41c1078
--- /dev/null
+++ b/ext/date/tests/bug68406.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Bug #68406 calling var_dump on a DateTimeZone object modifies it
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+
+$tz1 = new DateTimeZone('Europe/Berlin');
+$tz2 = new DateTimeZone('Europe/Berlin');
+
+$d = new DateTime('2014-12-24 13:00:00', $tz1);
+var_dump($d->getTimezone(), $tz2);
+
+if($tz2 == $d->getTimezone()) {
+ echo "yes";
+}
+else {
+ echo "no";
+}
+
+--EXPECT--
+object(DateTimeZone)#4 (2) {
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(13) "Europe/Berlin"
+}
+object(DateTimeZone)#2 (2) {
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(13) "Europe/Berlin"
+}
+yes