summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2009-12-15 12:34:12 +0000
committerIlia Alshanetsky <iliaa@php.net>2009-12-15 12:34:12 +0000
commitd0f6848e6600f9c96ce16930835000b976b87f84 (patch)
tree4e097c13f64b88a4eb6fc29f3a497b9e19d5f700
parent4e10081f8f6d3cbd02abf77c56ab823deb1fa46a (diff)
downloadphp-git-d0f6848e6600f9c96ce16930835000b976b87f84.tar.gz
Fixed bu #50392 (date_create_from_format() enforces 6 digits for 'u' format character)
-rw-r--r--NEWS2
-rw-r--r--ext/date/lib/parse_date.c8
-rw-r--r--ext/date/lib/parse_date.re6
-rw-r--r--ext/date/tests/bug50392.phpt63
4 files changed, 72 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index cbfe15a9bf..3554e964a3 100644
--- a/NEWS
+++ b/NEWS
@@ -40,6 +40,8 @@ PHP NEWS
seg fault). (davbrown4 at yahoo dot com, Felipe)
- Fixed bug #50351 (performance regression handling objects, ten times slower
in 5.3 than in 5.2). (Dmitry)
+- Fixed bug #50392 (date_create_from_format() enforces 6 digits for 'u'
+ format character). (Ilia)
- Fixed bug #50345 (nanosleep not detected properly on some solaris versions).
(Jani)
- Fixed bug #50340 (php.ini parser does not allow spaces in ini keys). (Jani)
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index cfb24502f5..c02d946311 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 Wed Jul 29 16:20:12 2009 */
+/* Generated by re2c 0.13.5 on Mon Dec 14 07:41:45 2009 */
#line 1 "ext/date/lib/parse_date.re"
/*
+----------------------------------------------------------------------+
@@ -24086,15 +24086,15 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
add_pbf_error(s, "A two digit second could not be found", string, begin);
}
break;
- case 'u': /* six digit millisecond */
+ case 'u': /* up to six digit millisecond */
{
double f;
char *tptr;
TIMELIB_CHECK_NUMBER;
tptr = ptr;
- if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || ptr - tptr != 6) {
- add_pbf_error(s, "A six digit millisecond could not be found", string, begin);
+ if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || (ptr - tptr) < 1) {
+ add_pbf_error(s, "At least a single digit millisecond could not be found", string, begin);
} else {
s->time->f = (f / 1000000);
}
diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re
index 2fadb7b92e..400de37927 100644
--- a/ext/date/lib/parse_date.re
+++ b/ext/date/lib/parse_date.re
@@ -1943,15 +1943,15 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
add_pbf_error(s, "A two digit second could not be found", string, begin);
}
break;
- case 'u': /* six digit millisecond */
+ case 'u': /* up to six digit millisecond */
{
double f;
char *tptr;
TIMELIB_CHECK_NUMBER;
tptr = ptr;
- if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || ptr - tptr != 6) {
- add_pbf_error(s, "A six digit millisecond could not be found", string, begin);
+ if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || (ptr - tptr) < 1) {
+ add_pbf_error(s, "At least a single digit millisecond could not be found", string, begin);
} else {
s->time->f = (f / 1000000);
}
diff --git a/ext/date/tests/bug50392.phpt b/ext/date/tests/bug50392.phpt
new file mode 100644
index 0000000000..8d10923e03
--- /dev/null
+++ b/ext/date/tests/bug50392.phpt
@@ -0,0 +1,63 @@
+--TEST--
+Bug #50392 date_create_from_format enforces 6 digits for 'u' format character
+--FILE--
+<?php
+date_default_timezone_set('Europe/Bratislava');
+
+$base = '2009-03-01 18:00:00';
+
+for ($i = 0; $i < 8; $i++) {
+ var_dump(date_create_from_format('Y-m-d H:i:s.u', $base . '.' . str_repeat('1', $i)));
+}
+?>
+--EXPECT--
+bool(false)
+object(DateTime)#2 (3) {
+ ["date"]=>
+ string(19) "2009-03-01 18:00:00"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(17) "Europe/Bratislava"
+}
+object(DateTime)#2 (3) {
+ ["date"]=>
+ string(19) "2009-03-01 18:00:00"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(17) "Europe/Bratislava"
+}
+object(DateTime)#2 (3) {
+ ["date"]=>
+ string(19) "2009-03-01 18:00:00"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(17) "Europe/Bratislava"
+}
+object(DateTime)#2 (3) {
+ ["date"]=>
+ string(19) "2009-03-01 18:00:00"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(17) "Europe/Bratislava"
+}
+object(DateTime)#2 (3) {
+ ["date"]=>
+ string(19) "2009-03-01 18:00:00"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(17) "Europe/Bratislava"
+}
+object(DateTime)#2 (3) {
+ ["date"]=>
+ string(19) "2009-03-01 18:00:00"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(17) "Europe/Bratislava"
+}
+bool(false)