From: Adam Harvey Date: Fri, 26 Mar 2010 04:31:26 +0000 (+0000) Subject: Fixed bug #51393 (DateTime::createFromFormat() fails if format string contains timezone). X-Git-Tag: php-5.3.3RC1~366 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=53cfb3d53df9e2115f404bb98d89653b7a5bbd1d;p=php Fixed bug #51393 (DateTime::createFromFormat() fails if format string contains timezone). --- diff --git a/NEWS b/NEWS index d432332a26..8a141e314a 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,8 @@ PHP NEWS - Fixed a NULL pointer dereference when processing invalid XML-RPC requests (Fixes CVE-2010-0397, bug #51288). (Raphael Geissert) +- Fixed bug #51393 (DateTime::createFromFormat() fails if format string contains + timezone). (Adam) - Fixed bug #51338 (URL-Rewriter is still enabled if use_only_cookies is on). (Ilia, j dot jeising at gmail dot com) - Fixed bug #51269 (zlib.output_compression Overwrites Vary Header). (Adam) diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 7cd3e5f45c..3d76fa8b98 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Sun Mar 7 18:37:37 2010 */ +/* Generated by re2c 0.13.5 on Fri Mar 26 12:00:44 2010 */ #line 1 "ext/date/lib/parse_date.re" /* +----------------------------------------------------------------------+ @@ -526,7 +526,7 @@ static long timelib_parse_tz_cor(char **ptr) char *begin = *ptr, *end; long tmp; - while (**ptr != '\0') { + while (isdigit(**ptr) || **ptr == ':') { ++*ptr; } end = *ptr; diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 59feef9eb3..4eae69376b 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -524,7 +524,7 @@ static long timelib_parse_tz_cor(char **ptr) char *begin = *ptr, *end; long tmp; - while (**ptr != '\0') { + while (isdigit(**ptr) || **ptr == ':') { ++*ptr; } end = *ptr; diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c index cc58f1dc60..a08dcc4b56 100644 --- a/ext/date/lib/parse_iso_intervals.c +++ b/ext/date/lib/parse_iso_intervals.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Sun Mar 7 14:12:01 2010 */ +/* Generated by re2c 0.13.5 on Fri Mar 26 12:12:03 2010 */ #line 1 "ext/date/lib/parse_iso_intervals.re" /* +----------------------------------------------------------------------+ @@ -183,7 +183,7 @@ static long timelib_parse_tz_cor(char **ptr) char *begin = *ptr, *end; long tmp; - while (**ptr != '\0') { + while (isdigit(**ptr) || **ptr == ':') { ++*ptr; } end = *ptr; diff --git a/ext/date/lib/parse_iso_intervals.re b/ext/date/lib/parse_iso_intervals.re index eb861a1a6b..bf2c287276 100644 --- a/ext/date/lib/parse_iso_intervals.re +++ b/ext/date/lib/parse_iso_intervals.re @@ -181,7 +181,7 @@ static long timelib_parse_tz_cor(char **ptr) char *begin = *ptr, *end; long tmp; - while (**ptr != '\0') { + while (isdigit(**ptr) || **ptr == ':') { ++*ptr; } end = *ptr; diff --git a/ext/date/tests/bug51393.phpt b/ext/date/tests/bug51393.phpt new file mode 100644 index 0000000000..c4c4d61a1e --- /dev/null +++ b/ext/date/tests/bug51393.phpt @@ -0,0 +1,73 @@ +--TEST-- +Bug #51393 (DateTime::createFromFormat() fails if format string contains timezone) +--FILE-- +getOffset()); + +$dt = DateTime::createFromFormat('P', '+08:00'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('O', '-0800'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('P', '-08:00'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[O]', '[+0800]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[P]', '[+08:00]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[O]', '[-0800]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[P]', '[-08:00]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('O', 'GMT+0800'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('P', 'GMT+08:00'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('O', 'GMT-0800'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('P', 'GMT-08:00'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[O]', '[GMT+0800]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[P]', '[GMT+08:00]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[O]', '[GMT-0800]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('[P]', '[GMT-08:00]'); +var_dump($dt->getOffset()); + +$dt = DateTime::createFromFormat('O', 'invalid'); +var_dump($dt); +?> +--EXPECT-- +int(28800) +int(28800) +int(-28800) +int(-28800) +int(28800) +int(28800) +int(-28800) +int(-28800) +int(28800) +int(28800) +int(-28800) +int(-28800) +int(28800) +int(28800) +int(-28800) +int(-28800) +bool(false)