From: Stanislav Malyshev Date: Wed, 1 Sep 2010 20:34:59 +0000 (+0000) Subject: Fix bug #50590 - IntlDateFormatter::parse result is limited to the integer range X-Git-Tag: php-5.4.0alpha1~191^2~1004 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=68eb876351cf7b6d8f57d412e92368cbd19313fd;p=php Fix bug #50590 - IntlDateFormatter::parse result is limited to the integer range --- diff --git a/ext/intl/dateformat/dateformat_parse.c b/ext/intl/dateformat/dateformat_parse.c index c17089f1ca..4193e89017 100755 --- a/ext/intl/dateformat/dateformat_parse.c +++ b/ext/intl/dateformat/dateformat_parse.c @@ -19,6 +19,7 @@ #endif #include +#include #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 index 0000000000..8a7608a243 --- /dev/null +++ b/ext/intl/tests/bug50590.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #50590 (IntlDateFormatter::parse result is limited to the integer range) +--SKIPIF-- + +--FILE-- +parse("Wednesday, January 20, 2038 3:14:07 AM GMT")); + +?> +--EXPECTF-- +float(2147570047) diff --git a/ext/intl/tests/dateformat_format_parse.phpt b/ext/intl/tests/dateformat_format_parse.phpt index eb4e989844..bd41d715b9 100755 --- a/ext/intl/tests/dateformat_format_parse.phpt +++ b/ext/intl/tests/dateformat_format_parse.phpt @@ -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' , diff --git a/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt b/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt index fa40257372..b7e820388a 100755 --- a/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt +++ b/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt @@ -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