derick                                   Wed, 10 Feb 2010 16:23:30 +0000

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

Log:
- Added a test case for bug #45866
- Fixed tests: oo_002, bug46268
- Fixed bug #50930 (Wrong date by php_date.c patch with ancient gcc/glibc
  versions).
- Make sure faulty strings passed to DateTime::modify() notify the user.
- Revert fix for bug #50392 as it was fixed wrongly without a proper test case.
- Fixed a bug with the 'r' formatting function as the default buffer size that
  was allocated only fit 4 digit years.

Bugs: http://bugs.php.net/45866 (Closed) decimal values fed to 
DateTime->modify() causes long execution times
      http://bugs.php.net/46268 (Closed) When call DateTime#setTime, it seems 
to be called the last modify method too
      http://bugs.php.net/50930 (Assigned) wrong date by php_date.c patch with 
ancient gcc/glibc versions
      http://bugs.php.net/50392 (Open) date_create_from_format enforces 6 
digits for 'u' format character
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/ext/date/config0.m4
    U   php/php-src/branches/PHP_5_2/ext/date/lib/parse_date.c
    U   php/php-src/branches/PHP_5_2/ext/date/php_date.c
    A   php/php-src/branches/PHP_5_2/ext/date/tests/bug45866.phpt
    U   php/php-src/branches/PHP_5_2/ext/date/tests/bug46268.phpt
    U   php/php-src/branches/PHP_5_2/ext/date/tests/oo_002.phpt
    U   php/php-src/branches/PHP_5_3/ext/date/config0.m4
    U   php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c
    U   php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re
    U   php/php-src/branches/PHP_5_3/ext/date/php_date.c
    A   php/php-src/branches/PHP_5_3/ext/date/tests/bug45866.phpt
    U   php/php-src/branches/PHP_5_3/ext/date/tests/bug46268.phpt
    U   php/php-src/branches/PHP_5_3/ext/date/tests/oo_002.phpt
    U   php/php-src/trunk/ext/date/config0.m4
    U   php/php-src/trunk/ext/date/lib/parse_date.c
    U   php/php-src/trunk/ext/date/lib/parse_date.re
    U   php/php-src/trunk/ext/date/php_date.c
    A   php/php-src/trunk/ext/date/tests/bug45866.phpt
    U   php/php-src/trunk/ext/date/tests/bug46268.phpt
    U   php/php-src/trunk/ext/date/tests/oo_002.phpt

Modified: php/php-src/branches/PHP_5_2/ext/date/config0.m4
===================================================================
--- php/php-src/branches/PHP_5_2/ext/date/config0.m4	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_2/ext/date/config0.m4	2010-02-10 16:23:30 UTC (rev 294854)
@@ -16,8 +16,6 @@

 PHP_INSTALL_HEADERS([ext/date], [php_date.h lib/timelib.h lib/timelib_structs.h lib/timelib_config.h])

-AC_CHECK_FUNCS([llabs])
-
 cat > $ext_builddir/lib/timelib_config.h <<EOF
 #ifdef PHP_WIN32
 # include "config.w32.h"

Modified: php/php-src/branches/PHP_5_2/ext/date/lib/parse_date.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/date/lib/parse_date.c	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_2/ext/date/lib/parse_date.c	2010-02-10 16:23:30 UTC (rev 294854)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Thu Jan  7 07:49:11 2010 */
+/* Generated by re2c 0.13.5 on Wed Feb 10 15:19:28 2010 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+

Modified: php/php-src/branches/PHP_5_2/ext/date/php_date.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/date/php_date.c	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_2/ext/date/php_date.c	2010-02-10 16:23:30 UTC (rev 294854)
@@ -30,16 +30,12 @@
 #include "lib/timelib.h"
 #include <time.h>

-#ifndef HAVE_LLABS
-# ifdef PHP_WIN32
-static __inline __int64 llabs( __int64 i ) { return i >= 0? i: -i; }
-# elif defined(__GNUC__) && __GNUC__ < 3
-static __inline __int64_t llabs( __int64_t i ) { return i >= 0 ? i : -i; }
-# elif defined(NETWARE) && defined(__MWERKS__)
-static __inline long long llabs( long long i ) { return i >= 0 ? i : -i; }
-# endif
+#ifdef PHP_WIN32
+# include "win32/php_stdint.h"
 #endif

+static __inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; }
+
 /* {{{ arginfo */
 static
 ZEND_BEGIN_ARG_INFO_EX(arginfo_date, 0, 0, 1)
@@ -752,7 +748,7 @@
 {
 	smart_str            string = {0};
 	int                  i, length;
-	char                 buffer[33];
+	char                 buffer[97];
 	timelib_time_offset *offset = NULL;
 	timelib_sll          isoweek, isoyear;
 	int                  rfc_colon;
@@ -811,7 +807,7 @@
 			/* year */
 			case 'L': length = slprintf(buffer, 32, "%d", timelib_is_leap((int) t->y)); break;
 			case 'y': length = slprintf(buffer, 32, "%02d", (int) t->y % 100); break;
-			case 'Y': length = slprintf(buffer, 32, "%s%04lld", t->y < 0 ? "-" : "", llabs(t->y)); break;
+			case 'Y': length = slprintf(buffer, 32, "%s%04lld", t->y < 0 ? "-" : "", php_date_llabs((timelib_sll) t->y)); break;

 			/* time */
 			case 'a': length = slprintf(buffer, 32, "%s", t->h >= 12 ? "pm" : "am"); break;
@@ -875,7 +871,7 @@
 											localtime ? abs((offset->offset % 3600) / 60) : 0
 							  );
 					  break;
-			case 'r': length = slprintf(buffer, 32, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d",
+			case 'r': length = slprintf(buffer, 96, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d",
 							                php_date_short_day_name(t->y, t->m, t->d),
 											(int) t->d, mon_short_names[t->m - 1],
 											(int) t->y, (int) t->h, (int) t->i, (int) t->s,
@@ -1936,6 +1932,7 @@
 	char         *modify;
 	int           modify_len;
 	timelib_time *tmp_time;
+	timelib_error_container *err = NULL;

 	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) {
 		RETURN_FALSE;
@@ -1943,7 +1940,16 @@
 	dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
 	DATE_CHECK_INITIALIZED(dateobj->time, DateTime);

-	tmp_time = timelib_strtotime(modify, modify_len, NULL, DATE_TIMEZONEDB);
+	tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB);
+
+	if (err && err->error_count) {
+		/* spit out the first library error message, at least */
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify,
+			err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
+		timelib_time_dtor(tmp_time);
+		RETURN_FALSE;
+	}
+
 	memcpy(&dateobj->time->relative, &tmp_time->relative, sizeof(struct timelib_rel_time));
 	dateobj->time->have_relative = tmp_time->have_relative;
 	dateobj->time->have_weekday_relative = tmp_time->have_weekday_relative;

Added: php/php-src/branches/PHP_5_2/ext/date/tests/bug45866.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/date/tests/bug45866.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_2/ext/date/tests/bug45866.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -0,0 +1,24 @@
+--TEST--
+Bug #45866 (decimal values fed to DateTime->modify() causes long execution times)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "+1.61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "£61538461538 day" );
+echo $date->format( 'r' ), "\n";
+?>
+--EXPECTF--
+Thu, 14 Aug 168488594 16:44:23 +0000
+Thu, 14 Aug 168488594 16:44:23 +0000
+
+Warning: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character in %sbug45866.php on line 11
+Wed, 29 Jul 2009 16:44:23 +0100

Modified: php/php-src/branches/PHP_5_2/ext/date/tests/bug46268.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/date/tests/bug46268.phpt	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_2/ext/date/tests/bug46268.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -7,10 +7,10 @@
 $now = new DateTime('2008-10-10 01:02:03');
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

-$now->modify("1 day after");
+$now->modify("1 day");
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

-$now->modify("1 hour after");
+$now->modify("1 hour");
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

 $now->setTime(0, 0, 0);

Modified: php/php-src/branches/PHP_5_2/ext/date/tests/oo_002.phpt
===================================================================
--- php/php-src/branches/PHP_5_2/ext/date/tests/oo_002.phpt	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_2/ext/date/tests/oo_002.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -10,7 +10,7 @@
 var_dump($d->format(DateTime::RFC822));
 $c = clone $d;
 var_dump($c->format(DateTime::RFC822));
-$d->modify("1 hour after");
+$d->modify("1 hour");
 $c->modify("1 second ago");
 var_dump($d->format(DateTime::RFC822));
 var_dump($c->format(DateTime::RFC822));

Modified: php/php-src/branches/PHP_5_3/ext/date/config0.m4
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/config0.m4	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_3/ext/date/config0.m4	2010-02-10 16:23:30 UTC (rev 294854)
@@ -16,8 +16,6 @@

 PHP_INSTALL_HEADERS([ext/date], [php_date.h lib/timelib.h lib/timelib_structs.h lib/timelib_config.h])

-AC_CHECK_FUNCS([llabs])
-
 cat > $ext_builddir/lib/timelib_config.h <<EOF
 #ifdef PHP_WIN32
 # include "config.w32.h"

Modified: php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c	2010-02-10 16:23:30 UTC (rev 294854)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Thu Jan  7 07:52:26 2010 */
+/* Generated by re2c 0.13.5 on Wed Feb 10 15:19:23 2010 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -24157,8 +24157,8 @@

 					TIMELIB_CHECK_NUMBER;
 					tptr = ptr;
-					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);
+					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);
 					} else {
 						s->time->f = (f / 1000000);
 					}

Modified: php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re	2010-02-10 16:23:30 UTC (rev 294854)
@@ -1951,8 +1951,8 @@

 					TIMELIB_CHECK_NUMBER;
 					tptr = ptr;
-					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);
+					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);
 					} else {
 						s->time->f = (f / 1000000);
 					}

Modified: php/php-src/branches/PHP_5_3/ext/date/php_date.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/php_date.c	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_3/ext/date/php_date.c	2010-02-10 16:23:30 UTC (rev 294854)
@@ -35,13 +35,7 @@
 # include "win32/php_stdint.h"
 #endif

-#ifndef HAVE_LLABS
-# if defined(__GNUC__) && __GNUC__ < 3
-static __inline __int64_t llabs( __int64_t i ) { return i >= 0 ? i : -i; }
-# elif defined(NETWARE) && defined(__MWERKS__)
-static __inline long long llabs( long long i ) { return i >= 0 ? i : -i; }
-# endif
-#endif
+static __inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; }

 /* {{{ arginfo */
 ZEND_BEGIN_ARG_INFO_EX(arginfo_date, 0, 0, 1)
@@ -1011,7 +1005,7 @@
 {
 	smart_str            string = {0};
 	int                  i, length;
-	char                 buffer[33];
+	char                 buffer[97];
 	timelib_time_offset *offset = NULL;
 	timelib_sll          isoweek, isoyear;
 	int                  rfc_colon;
@@ -1070,7 +1064,7 @@
 			/* year */
 			case 'L': length = slprintf(buffer, 32, "%d", timelib_is_leap((int) t->y)); break;
 			case 'y': length = slprintf(buffer, 32, "%02d", (int) t->y % 100); break;
-			case 'Y': length = slprintf(buffer, 32, "%s%04lld", t->y < 0 ? "-" : "", llabs((timelib_sll) t->y)); break;
+			case 'Y': length = slprintf(buffer, 32, "%s%04lld", t->y < 0 ? "-" : "", php_date_llabs((timelib_sll) t->y)); break;

 			/* time */
 			case 'a': length = slprintf(buffer, 32, "%s", t->h >= 12 ? "pm" : "am"); break;
@@ -1134,7 +1128,7 @@
 											localtime ? abs((offset->offset % 3600) / 60) : 0
 							  );
 					  break;
-			case 'r': length = slprintf(buffer, 32, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d",
+			case 'r': length = slprintf(buffer, 96, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d",
 							                php_date_short_day_name(t->y, t->m, t->d),
 											(int) t->d, mon_short_names[t->m - 1],
 											(int) t->y, (int) t->h, (int) t->i, (int) t->s,
@@ -2759,6 +2753,7 @@
 	char         *modify;
 	int           modify_len;
 	timelib_time *tmp_time;
+	timelib_error_container *err = NULL;

 	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) {
 		RETURN_FALSE;
@@ -2766,7 +2761,18 @@
 	dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
 	DATE_CHECK_INITIALIZED(dateobj->time, DateTime);

-	tmp_time = timelib_strtotime(modify, modify_len, NULL, DATE_TIMEZONEDB);
+	tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB);
+
+	/* update last errors and warnings */
+	update_errors_warnings(err TSRMLS_CC);
+	if (err && err->error_count) {
+		/* spit out the first library error message, at least */
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify,
+			err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
+		timelib_time_dtor(tmp_time);
+		RETURN_FALSE;
+	}
+
 	memcpy(&dateobj->time->relative, &tmp_time->relative, sizeof(struct timelib_rel_time));
 	dateobj->time->have_relative = tmp_time->have_relative;
 	dateobj->time->sse_uptodate = 0;

Added: php/php-src/branches/PHP_5_3/ext/date/tests/bug45866.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/tests/bug45866.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/date/tests/bug45866.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -0,0 +1,24 @@
+--TEST--
+Bug #45866 (decimal values fed to DateTime->modify() causes long execution times)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "+1.61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "£61538461538 day" );
+echo $date->format( 'r' ), "\n";
+?>
+--EXPECTF--
+Thu, 14 Aug 168488594 16:44:23 +0000
+Thu, 14 Aug 168488594 16:44:23 +0000
+
+Warning: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character in %sbug45866.php on line 11
+Wed, 29 Jul 2009 16:44:23 +0100

Modified: php/php-src/branches/PHP_5_3/ext/date/tests/bug46268.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/tests/bug46268.phpt	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_3/ext/date/tests/bug46268.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -7,10 +7,10 @@
 $now = new DateTime('2008-10-10 01:02:03');
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

-$now->modify("1 day after");
+$now->modify("1 day");
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

-$now->modify("1 hour after");
+$now->modify("1 hour");
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

 $now->setTime(0, 0, 0);

Modified: php/php-src/branches/PHP_5_3/ext/date/tests/oo_002.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/tests/oo_002.phpt	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/branches/PHP_5_3/ext/date/tests/oo_002.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -9,7 +9,7 @@
 var_dump($d->format(DateTime::RFC822));
 $c = clone $d;
 var_dump($c->format(DateTime::RFC822));
-$d->modify("1 hour after");
+$d->modify("1 hour");
 $c->modify("1 second ago");
 var_dump($d->format(DateTime::RFC822));
 var_dump($c->format(DateTime::RFC822));

Modified: php/php-src/trunk/ext/date/config0.m4
===================================================================
--- php/php-src/trunk/ext/date/config0.m4	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/trunk/ext/date/config0.m4	2010-02-10 16:23:30 UTC (rev 294854)
@@ -16,8 +16,6 @@

 PHP_INSTALL_HEADERS([ext/date], [php_date.h lib/timelib.h lib/timelib_structs.h lib/timelib_config.h])

-AC_CHECK_FUNCS([llabs])
-
 cat > $ext_builddir/lib/timelib_config.h <<EOF
 #ifdef PHP_WIN32
 # include "config.w32.h"

Modified: php/php-src/trunk/ext/date/lib/parse_date.c
===================================================================
--- php/php-src/trunk/ext/date/lib/parse_date.c	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/trunk/ext/date/lib/parse_date.c	2010-02-10 16:23:30 UTC (rev 294854)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Thu Jan  7 07:53:05 2010 */
+/* Generated by re2c 0.13.5 on Wed Feb 10 15:19:16 2010 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -24157,8 +24157,8 @@

 					TIMELIB_CHECK_NUMBER;
 					tptr = ptr;
-					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);
+					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);
 					} else {
 						s->time->f = (f / 1000000);
 					}

Modified: php/php-src/trunk/ext/date/lib/parse_date.re
===================================================================
--- php/php-src/trunk/ext/date/lib/parse_date.re	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/trunk/ext/date/lib/parse_date.re	2010-02-10 16:23:30 UTC (rev 294854)
@@ -1951,8 +1951,8 @@

 					TIMELIB_CHECK_NUMBER;
 					tptr = ptr;
-					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);
+					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);
 					} else {
 						s->time->f = (f / 1000000);
 					}

Modified: php/php-src/trunk/ext/date/php_date.c
===================================================================
--- php/php-src/trunk/ext/date/php_date.c	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/trunk/ext/date/php_date.c	2010-02-10 16:23:30 UTC (rev 294854)
@@ -36,13 +36,7 @@
 # include "win32/php_stdint.h"
 #endif

-#ifndef HAVE_LLABS
-# if defined(__GNUC__) && __GNUC__ < 3
-static __inline __int64_t llabs( __int64_t i ) { return i >= 0 ? i : -i; }
-# elif defined(NETWARE) && defined(__MWERKS__)
-static __inline long long llabs( long long i ) { return i >= 0 ? i : -i; }
-# endif
-#endif
+static __inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; }

 /* {{{ arginfo */
 ZEND_BEGIN_ARG_INFO_EX(arginfo_date, 0, 0, 1)
@@ -790,7 +784,6 @@

 	php_date_global_timezone_db = NULL;
 	php_date_global_timezone_db_enabled = 0;
-
 	DATEG(last_errors) = NULL;
 	return SUCCESS;
 }
@@ -2889,7 +2882,7 @@
 	char         *modify;
 	int           modify_len;
 	timelib_time *tmp_time;
-	struct timelib_error_container *error;
+	timelib_error_container *err = NULL;

 	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) {
 		RETURN_FALSE;
@@ -2897,13 +2890,14 @@
 	dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
 	DATE_CHECK_INITIALIZED(dateobj->time, DateTime);

-	tmp_time = timelib_strtotime(modify, modify_len, &error, DATE_TIMEZONEDB);
+	tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB);

-	/* update last errors and warnings, and display the first one */
-	update_errors_warnings(error TSRMLS_CC);
-	if (error && error->error_count > 0) {
+	/* update last errors and warnings */
+	update_errors_warnings(err TSRMLS_CC);
+	if (err && err->error_count) {
+		/* spit out the first library error message, at least */
 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify,
-			error->error_messages[0].position, error->error_messages[0].character, error->error_messages[0].message);
+			err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
 		timelib_time_dtor(tmp_time);
 		RETURN_FALSE;
 	}

Added: php/php-src/trunk/ext/date/tests/bug45866.phpt
===================================================================
--- php/php-src/trunk/ext/date/tests/bug45866.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/date/tests/bug45866.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -0,0 +1,24 @@
+--TEST--
+Bug #45866 (decimal values fed to DateTime->modify() causes long execution times)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "+1.61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "£61538461538 day" );
+echo $date->format( 'r' ), "\n";
+?>
+--EXPECTF--
+Thu, 14 Aug 168488594 16:44:23 +0000
+Thu, 14 Aug 168488594 16:44:23 +0000
+
+Warning: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character in %sbug45866.php on line 11
+Wed, 29 Jul 2009 16:44:23 +0100

Modified: php/php-src/trunk/ext/date/tests/bug46268.phpt
===================================================================
--- php/php-src/trunk/ext/date/tests/bug46268.phpt	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/trunk/ext/date/tests/bug46268.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -7,10 +7,10 @@
 $now = new DateTime('2008-10-10 01:02:03');
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

-$now->modify("1 day after");
+$now->modify("1 day");
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

-$now->modify("1 hour after");
+$now->modify("1 hour");
 echo $now->format("Y-m-d H:i:s") . PHP_EOL;

 $now->setTime(0, 0, 0);

Modified: php/php-src/trunk/ext/date/tests/oo_002.phpt
===================================================================
--- php/php-src/trunk/ext/date/tests/oo_002.phpt	2010-02-10 16:16:18 UTC (rev 294853)
+++ php/php-src/trunk/ext/date/tests/oo_002.phpt	2010-02-10 16:23:30 UTC (rev 294854)
@@ -10,7 +10,7 @@
 var_dump($d->format(DateTime::RFC822));
 $c = clone $d;
 var_dump($c->format(DateTime::RFC822));
-$d->modify("1 hour after");
+$d->modify("1 hour");
 $c->modify("1 second ago");
 var_dump($d->format(DateTime::RFC822));
 var_dump($c->format(DateTime::RFC822));
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to