stas                                     Wed, 01 Sep 2010 20:34:59 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=302982

Log:
Fix bug #50590 - IntlDateFormatter::parse result is limited to the integer range

Bug: http://bugs.php.net/50590 (Assigned) IntlDateFormatter::parse result is 
limited to the integer range
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/intl/dateformat/dateformat_parse.c
    A   php/php-src/branches/PHP_5_3/ext/intl/tests/bug50590.phpt
    U   php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_format_parse.phpt
    U   
php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt
    U   php/php-src/trunk/ext/intl/dateformat/dateformat_parse.c
    A   php/php-src/trunk/ext/intl/tests/bug50590.phpt
    U   php/php-src/trunk/ext/intl/tests/dateformat_format_parse.phpt
    U   
php/php-src/trunk/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/branches/PHP_5_3/NEWS	2010-09-01 20:34:59 UTC (rev 302982)
@@ -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

Modified: php/php-src/branches/PHP_5_3/ext/intl/dateformat/dateformat_parse.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/intl/dateformat/dateformat_parse.c	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/branches/PHP_5_3/ext/intl/dateformat/dateformat_parse.c	2010-09-01 20:34:59 UTC (rev 302982)
@@ -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 @@
 	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 );
 }
 /* }}} */


Added: php/php-src/branches/PHP_5_3/ext/intl/tests/bug50590.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/intl/tests/bug50590.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/intl/tests/bug50590.phpt	2010-09-01 20:34:59 UTC (rev 302982)
@@ -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)

Modified: php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_format_parse.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_format_parse.phpt	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_format_parse.phpt	2010-09-01 20:34:59 UTC (rev 302982)
@@ -187,16 +187,13 @@

 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 @@

 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 @@
 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' ,

Modified: php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/branches/PHP_5_3/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt	2010-09-01 20:34:59 UTC (rev 302982)
@@ -76,8 +76,7 @@
 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 @@
 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

Modified: php/php-src/trunk/ext/intl/dateformat/dateformat_parse.c
===================================================================
--- php/php-src/trunk/ext/intl/dateformat/dateformat_parse.c	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/trunk/ext/intl/dateformat/dateformat_parse.c	2010-09-01 20:34:59 UTC (rev 302982)
@@ -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 @@
 	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 );
 }
 /* }}} */


Added: php/php-src/trunk/ext/intl/tests/bug50590.phpt
===================================================================
--- php/php-src/trunk/ext/intl/tests/bug50590.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/intl/tests/bug50590.phpt	2010-09-01 20:34:59 UTC (rev 302982)
@@ -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)

Modified: php/php-src/trunk/ext/intl/tests/dateformat_format_parse.phpt
===================================================================
--- php/php-src/trunk/ext/intl/tests/dateformat_format_parse.phpt	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/trunk/ext/intl/tests/dateformat_format_parse.phpt	2010-09-01 20:34:59 UTC (rev 302982)
@@ -187,16 +187,13 @@

 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 @@

 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 @@
 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' ,

Modified: php/php-src/trunk/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt
===================================================================
--- php/php-src/trunk/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt	2010-09-01 18:27:41 UTC (rev 302981)
+++ php/php-src/trunk/ext/intl/tests/dateformat_parse_timestamp_parsepos.phpt	2010-09-01 20:34:59 UTC (rev 302982)
@@ -76,8 +76,7 @@
 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 @@
 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
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to