mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Fix bug #50590 - IntlDateFormatter::parse result is limited to the integer range
This commit is contained in:
parent
383d7d005a
commit
68eb876351
@ -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 );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
13
ext/intl/tests/bug50590.phpt
Normal file
13
ext/intl/tests/bug50590.phpt
Normal file
@ -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)
|
@ -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' ,
|
||||
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' ,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user