]> granicus.if.org Git - php/commitdiff
Fix bug #50590 - IntlDateFormatter::parse result is limited to the integer range
authorStanislav Malyshev <stas@php.net>
Wed, 1 Sep 2010 20:34:59 +0000 (20:34 +0000)
committerStanislav Malyshev <stas@php.net>
Wed, 1 Sep 2010 20:34:59 +0000 (20:34 +0000)
NEWS
ext/intl/dateformat/dateformat_parse.c
ext/intl/tests/bug50590.phpt [new file with mode: 0644]
ext/intl/tests/dateformat_format_parse.phpt
ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt

diff --git a/NEWS b/NEWS
index 60fd6130b7fd6524333b7ccd44c2c432c5108e48..339a9b66386d769d41dd3172f1b62a904d5a2582 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -64,6 +64,8 @@
 - Fixed bug #51610 (Using oci_connect causes PHP to take a long time to
   exit). Requires Oracle bug fix 9891199 for this patch to have an
   effect. (Oracle Corp.)
+- Fixed bug #50590 (IntlDateFormatter::parse result is limited to the integer
+  range). (Stas)
 - Fixed bug #50481 (Storing many SPLFixedArray in an array crashes). (Felipe)
 
 22 Jul 2010, PHP 5.3.3
index c17089f1ca1d8f258339b8037c24c0d87970755b..4193e890175b921e97ca4dffb62238d0047e4831 100755 (executable)
@@ -19,6 +19,7 @@
 #endif
 
 #include <unicode/ustring.h>
+#include <math.h>
 
 #include "php_intl.h"
 #include "intl_convert.h"
@@ -35,7 +36,7 @@
 */
 static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC)
 {
-       long    result =  0;
+       double  result =  0;
        UDate   timestamp   =0;
        UChar*  text_utf16  = NULL;
        int32_t text_utf16_len = 0;
@@ -52,12 +53,12 @@ static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* tex
        INTL_METHOD_CHECK_STATUS( dfo, "Date parsing failed" );
        
        /* Since return is in  sec. */
-       result = (long )( timestamp / 1000 );
-       if( result != (timestamp/1000) ) {
-               intl_error_set( NULL, U_BUFFER_OVERFLOW_ERROR,
-                                "datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.\nThe valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.", 0 TSRMLS_CC );
+       result = (double)timestamp / U_MILLIS_PER_SECOND;
+       if(result > LONG_MAX || result < -LONG_MAX) {
+               ZVAL_DOUBLE(return_value, result<0?ceil(result):floor(result));
+       } else {
+               ZVAL_LONG(return_value, (long)result);
        }
-       RETURN_LONG( result );
 }
 /* }}} */
 
diff --git a/ext/intl/tests/bug50590.phpt b/ext/intl/tests/bug50590.phpt
new file mode 100644 (file)
index 0000000..8a7608a
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Bug #50590 (IntlDateFormatter::parse result is limited to the integer range)
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+--FILE--
+<?php
+
+$fmt = new IntlDateFormatter("en_US", IntlDateFormatter::FULL, IntlDateFormatter::FULL);
+var_dump($fmt->parse("Wednesday, January 20, 2038 3:14:07 AM GMT"));
+
+?>
+--EXPECTF--
+float(2147570047)
index eb4e989844e831f3e0be4b4f46693d5591a4c64c..bd41d715b9e63c1baad5f14ba3bae015934517bc 100755 (executable)
@@ -187,16 +187,13 @@ Input timestamp is : 2200000000
 
 IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 
 Formatted timestamp is : Monday, September 19, 2039 4:06:40 AM GMT+05:00
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed timestamp is : 2200000000
 IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 
 Formatted timestamp is : September 19, 2039 4:06:40 AM GMT+05:00
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed timestamp is : 2200000000
 IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 
 Formatted timestamp is : Sep 19, 2039 4:06:40 AM
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed timestamp is : 2200000000
 ------------
 
 Input timestamp is : -2200000000
@@ -204,16 +201,13 @@ Input timestamp is : -2200000000
 
 IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 
 Formatted timestamp is : Sunday, April 15, 1900 5:53:20 AM GMT+05:00
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed timestamp is : -2200000000
 IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 
 Formatted timestamp is : April 15, 1900 5:53:20 AM GMT+05:00
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed timestamp is : -2200000000
 IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 
 Formatted timestamp is : Apr 15, 1900 5:53:20 AM
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed timestamp is : -2200000000
 ------------
 
 Input timestamp is : 90099999
@@ -297,4 +291,4 @@ Formatted localtime_array is : December 17, 1895 12:13:11 AM GMT+05:00
 Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , 
 IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 
 Formatted localtime_array is : Dec 17, 1895 12:13:11 AM
-Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' ,
\ No newline at end of file
+Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' ,
index fa402573723d871ee95167771b30705f32de55ee..b7e820388a325539b526804f40246c6013e8116d 100755 (executable)
@@ -76,8 +76,7 @@ Input text is : Sunday, September 18, 3039 4:06:40 PM PT
 Locale is : en_US_CA
 ------------
 datetype = 0 ,timetype =0 
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed text is : 33756908800
 datetype = 1 ,timetype =1 
 Error while parsing as: 'Date parsing failed: U_PARSE_ERROR'
 datetype = 2 ,timetype =2 
@@ -117,8 +116,7 @@ Error while parsing as: 'Date parsing failed: U_PARSE_ERROR'
 datetype = 3 ,timetype =3 
 Error while parsing as: 'Date parsing failed: U_PARSE_ERROR'
 datetype = -1 ,timetype =-1 
-Error while parsing as: 'datefmt_parse: parsing of input parametrs resulted in value larger than data type long can handle.
-The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT.: U_BUFFER_OVERFLOW_ERROR'
+Parsed text is : -2178601860
 ------------
 
 Input text is : 19691218 08:49 AM