diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/date/php_date.c | 16 | ||||
| -rw-r--r-- | ext/date/tests/bug44742.phpt | 35 |
2 files changed, 48 insertions, 3 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c index f1a72e1f98..a319831859 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2271,9 +2271,19 @@ PHP_FUNCTION(timezone_offset_get) dateobj = (php_date_obj *) zend_object_store_get_object(dateobject TSRMLS_CC); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); - offset = timelib_get_time_zone_info(dateobj->time->sse, tzobj->tzi.tz); - RETVAL_LONG(offset->offset); - timelib_time_offset_dtor(offset); + switch (tzobj->type) { + case TIMELIB_ZONETYPE_ID: + offset = timelib_get_time_zone_info(dateobj->time->sse, tzobj->tzi.tz); + RETVAL_LONG(offset->offset); + timelib_time_offset_dtor(offset); + break; + case TIMELIB_ZONETYPE_OFFSET: + RETURN_LONG(tzobj->tzi.utc_offset * -60); + break; + case TIMELIB_ZONETYPE_ABBR: + RETURN_LONG((tzobj->tzi.z.utc_offset - (tzobj->tzi.z.dst*60)) * -60); + break; + } } /* }}} */ diff --git a/ext/date/tests/bug44742.phpt b/ext/date/tests/bug44742.phpt new file mode 100644 index 0000000000..e6df1efabd --- /dev/null +++ b/ext/date/tests/bug44742.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #44742 (timezone_offset_get() causes segmentation faults) +--FILE-- +<?php +$dates = array( + "2008-04-11 00:00:00+0000", + "2008-04-11 00:00:00+0200", + "2008-04-11 00:00:00+0330", + "2008-04-11 00:00:00-0500", + "2008-04-11 00:00:00-1130", + "2008-04-11 00:00:00 CEST", + "2008-04-11 00:00:00 CET", + "2008-04-11 00:00:00 UTC", + "2008-04-11 00:00:00 America/New_York", + "2008-04-11 00:00:00 Europe/Oslo", + "2008-04-11 00:00:00 Asia/Singapore", +); +foreach ($dates as $date) +{ + $date = date_create($date); + var_dump(timezone_offset_get(date_timezone_get($date), $date)); +} +?> +--EXPECT-- +int(0) +int(7200) +int(12600) +int(-18000) +int(-41400) +int(7200) +int(3600) +int(0) +int(-14400) +int(7200) +int(28800) |
