]> granicus.if.org Git - php/commitdiff
Fixed bu #50392 (date_create_from_format() enforces 6 digits for 'u' format character)
authorIlia Alshanetsky <iliaa@php.net>
Tue, 15 Dec 2009 12:34:12 +0000 (12:34 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Tue, 15 Dec 2009 12:34:12 +0000 (12:34 +0000)
ext/date/lib/parse_date.c
ext/date/lib/parse_date.re
ext/date/tests/bug50392.phpt [new file with mode: 0644]

index c1beb48edf055bc8cd88d78876126133385f4ccd..a540589f8997d8e011acbc597fa29aa114dcdb60 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Wed Jul 29 16:40:36 2009 */
+/* Generated by re2c 0.13.5 on Tue Dec 15 07:32:15 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);
                                        }
index a4daa3c37fa70751c685113bf7737fb2a07f67d7..3c96581f62a8e6c2c8e6edad77d920e5fff25be4 100644 (file)
@@ -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 (file)
index 0000000..8d10923
--- /dev/null
@@ -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)