summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-04-25 17:23:26 +0200
committerAnatol Belski <ab@php.net>2014-04-25 17:23:26 +0200
commitc1aa9baf29d1a20fa60c1cef3979a80014f6677b (patch)
tree8a781678310ae0be2e4682806d8a11b4d46171bc
parent03c703b8bd55679edf30fe17529fab0c2281b01f (diff)
downloadphp-git-c1aa9baf29d1a20fa60c1cef3979a80014f6677b.tar.gz
Fixed bug #67118 DateTime constructor crash with invalid data
-rw-r--r--NEWS3
-rw-r--r--ext/date/php_date.c4
-rw-r--r--ext/date/tests/bug67118.phpt27
3 files changed, 33 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 26a1791ddb..2212b03a31 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,9 @@ PHP NEWS
by tempnam()). (Boro Sitnikovski)
. Fixed bug #67072 (Echoing unserialized "SplFileObject" crash). (Anatol)
+- Date:
+ . Fixed bug #67118 (DateTime constructor crash with invalid data). (Anatol)
+
- DOM:
. Fixed bug #67081 (DOMDocumentType->internalSubset returns entire DOCTYPE tag,
not only the subset). (Anatol)
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 4a37961b02..d4058ebee8 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -2548,7 +2548,9 @@ PHP_METHOD(DateTime, __construct)
zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC);
if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) {
- php_date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC);
+ if (!php_date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC)) {
+ ZVAL_NULL(getThis());
+ }
}
zend_restore_error_handling(&error_handling TSRMLS_CC);
}
diff --git a/ext/date/tests/bug67118.phpt b/ext/date/tests/bug67118.phpt
new file mode 100644
index 0000000000..b10e9eaea3
--- /dev/null
+++ b/ext/date/tests/bug67118.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #67118 php-cgi crashes regularly on IIS 7
+--INI--
+date.timezone=Europe/Berlin
+--FILE--
+<?php
+class mydt extends datetime
+{
+ publi function __construct($tits\bug67118.phpte = 'now', $tz = NULL, $format = NULL)
+ {
+ if (!empty($tz) && !is_object($tz)) {
+ $tz = new DateTimeZone($tz);
+ }
+
+ @parent::__construct($time, $tz);
+ }
+
+};
+
+new mydt("Funktionsansvarig rÄdgivning och juridik", "UTC");
+--EXPECTF--
+Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (Funktionsansvarig rÄdgivning och juridik) at position 0 (F): The timezone could not be found in the database' in %sbug67118.php:%d
+Stack trace:
+#0 %sbug67118.php(%d): DateTime->__construct('Funktionsansvar...', Object(DateTimeZone))
+#1 %sbug67118.php(%d): mydt->__construct('Funktionsansvar...', 'UTC')
+#2 {main}
+ thrown in %sbug67118.php on line %d