mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Fixed bug #35499 (strtotime() does not handle whitespace around the date
string).
This commit is contained in:
parent
f74f26f487
commit
f4248e51a4
6 changed files with 25441 additions and 16936 deletions
2
NEWS
2
NEWS
|
@ -18,6 +18,8 @@ PHP NEWS
|
||||||
- Fixed many bugs in OCI8. (Tony)
|
- Fixed many bugs in OCI8. (Tony)
|
||||||
- Fixed crash and leak in mysqli when using 4.1.x client libraries and
|
- Fixed crash and leak in mysqli when using 4.1.x client libraries and
|
||||||
connecting to 5.x server. (Andrey)
|
connecting to 5.x server. (Andrey)
|
||||||
|
- Fixed bug #35499 (strtotime() does not handle whitespace around the date
|
||||||
|
string). (Ilia)
|
||||||
- Fixed bug #35496 (Crash in mcrypt_generic()/mdecrypt_generic() without
|
- Fixed bug #35496 (Crash in mcrypt_generic()/mdecrypt_generic() without
|
||||||
proper init). (Ilia)
|
proper init). (Ilia)
|
||||||
- Fixed bug #35490 (socket_sendto() unable to handle IPv6 addresses). (Tony)
|
- Fixed bug #35490 (socket_sendto() unable to handle IPv6 addresses). (Tony)
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1379,16 +1379,32 @@ relativetext = (reltextnumber space? reltextunit)+;
|
||||||
|
|
||||||
/*!max:re2c */
|
/*!max:re2c */
|
||||||
|
|
||||||
timelib_time* timelib_strtotime(char *s, int *errors, timelib_tzdb *tzdb)
|
timelib_time* timelib_strtotime(char *s, int len, int *errors, timelib_tzdb *tzdb)
|
||||||
{
|
{
|
||||||
Scanner in;
|
Scanner in;
|
||||||
int t;
|
int t;
|
||||||
|
char *e = s + len - 1;
|
||||||
|
|
||||||
|
while (isspace(*s) && s < e) {
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
while (isspace(*e) && e > s) {
|
||||||
|
e--;
|
||||||
|
}
|
||||||
|
if (e - s < 1) {
|
||||||
|
*errors = 1;
|
||||||
|
in.time = timelib_time_ctor();
|
||||||
|
in.time->y = in.time->d = in.time->m = in.time->h = in.time->i = in.time->s = in.time->f = in.time->z = in.time->dst = -1;
|
||||||
|
in.time->is_localtime = in.time->zone_type = 0;
|
||||||
|
return in.time;
|
||||||
|
}
|
||||||
|
e++;
|
||||||
|
|
||||||
memset(&in, 0, sizeof(in));
|
memset(&in, 0, sizeof(in));
|
||||||
in.str = malloc(strlen(s) + YYMAXFILL);
|
in.str = malloc((e - s) + YYMAXFILL);
|
||||||
memset(in.str, 0, strlen(s) + YYMAXFILL);
|
memset(in.str, 0, (e - s) + YYMAXFILL);
|
||||||
memcpy(in.str, s, strlen(s));
|
memcpy(in.str, s, (e - s));
|
||||||
in.lim = in.str + strlen(s) + YYMAXFILL;
|
in.lim = in.str + (e - s) + YYMAXFILL;
|
||||||
in.cur = in.str;
|
in.cur = in.str;
|
||||||
in.time = timelib_time_ctor();
|
in.time = timelib_time_ctor();
|
||||||
in.time->y = -1;
|
in.time->y = -1;
|
||||||
|
|
|
@ -47,7 +47,7 @@ timelib_sll timelib_days_in_month(timelib_sll y, timelib_sll m);
|
||||||
void timelib_isoweek_from_date(timelib_sll y, timelib_sll m, timelib_sll d, timelib_sll *iw, timelib_sll *iy);
|
void timelib_isoweek_from_date(timelib_sll y, timelib_sll m, timelib_sll d, timelib_sll *iw, timelib_sll *iy);
|
||||||
|
|
||||||
/* From parse_date.re */
|
/* From parse_date.re */
|
||||||
timelib_time *timelib_strtotime(char *s, int *errors, timelib_tzdb *tzdb);
|
timelib_time *timelib_strtotime(char *s, int len, int *errors, timelib_tzdb *tzdb);
|
||||||
void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options);
|
void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options);
|
||||||
char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst);
|
char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst);
|
||||||
timelib_tz_lookup_table *timelib_timezone_abbreviations_list(void);
|
timelib_tz_lookup_table *timelib_timezone_abbreviations_list(void);
|
||||||
|
|
|
@ -764,7 +764,7 @@ signed long php_parse_date(char *string, signed long *now)
|
||||||
int error1, error2;
|
int error1, error2;
|
||||||
signed long retval;
|
signed long retval;
|
||||||
|
|
||||||
parsed_time = timelib_strtotime(string, &error1, DATE_TIMEZONEDB);
|
parsed_time = timelib_strtotime(string, strlen(string), &error1, DATE_TIMEZONEDB);
|
||||||
timelib_update_ts(parsed_time, NULL);
|
timelib_update_ts(parsed_time, NULL);
|
||||||
retval = timelib_date_to_int(parsed_time, &error2);
|
retval = timelib_date_to_int(parsed_time, &error2);
|
||||||
timelib_time_dtor(parsed_time);
|
timelib_time_dtor(parsed_time);
|
||||||
|
@ -795,7 +795,7 @@ PHP_FUNCTION(strtotime)
|
||||||
|
|
||||||
initial_ts = emalloc(25);
|
initial_ts = emalloc(25);
|
||||||
snprintf(initial_ts, 24, "@%lu", preset_ts);
|
snprintf(initial_ts, 24, "@%lu", preset_ts);
|
||||||
t = timelib_strtotime(initial_ts, &error1, DATE_TIMEZONEDB); /* we ignore the error here, as this should never fail */
|
t = timelib_strtotime(initial_ts, strlen(initial_ts), &error1, DATE_TIMEZONEDB); /* we ignore the error here, as this should never fail */
|
||||||
timelib_update_ts(t, tzi);
|
timelib_update_ts(t, tzi);
|
||||||
timelib_unixtime2local(now, t->sse, tzi);
|
timelib_unixtime2local(now, t->sse, tzi);
|
||||||
timelib_time_dtor(t);
|
timelib_time_dtor(t);
|
||||||
|
@ -808,7 +808,7 @@ PHP_FUNCTION(strtotime)
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
t = timelib_strtotime(times, &error1, DATE_TIMEZONEDB);
|
t = timelib_strtotime(times, time_len, &error1, DATE_TIMEZONEDB);
|
||||||
timelib_fill_holes(t, now, 0);
|
timelib_fill_holes(t, now, 0);
|
||||||
timelib_update_ts(t, tzi);
|
timelib_update_ts(t, tzi);
|
||||||
ts = timelib_date_to_int(t, &error2);
|
ts = timelib_date_to_int(t, &error2);
|
||||||
|
@ -1280,7 +1280,7 @@ PHP_FUNCTION(date_create)
|
||||||
|
|
||||||
date_instanciate(date_ce_date, return_value TSRMLS_CC);
|
date_instanciate(date_ce_date, return_value TSRMLS_CC);
|
||||||
dateobj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC);
|
dateobj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC);
|
||||||
dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", &error, DATE_TIMEZONEDB);
|
dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", time_str_len ? time_str_len : sizeof("now") -1, &error, DATE_TIMEZONEDB);
|
||||||
|
|
||||||
if (timezone_object) {
|
if (timezone_object) {
|
||||||
php_timezone_obj *tzobj;
|
php_timezone_obj *tzobj;
|
||||||
|
@ -1338,7 +1338,7 @@ PHP_FUNCTION(date_modify)
|
||||||
}
|
}
|
||||||
dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
|
dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
|
||||||
|
|
||||||
tmp_time = timelib_strtotime(modify, &error, DATE_TIMEZONEDB);
|
tmp_time = timelib_strtotime(modify, modify_len, &error, DATE_TIMEZONEDB);
|
||||||
dateobj->time->relative.y = tmp_time->relative.y;
|
dateobj->time->relative.y = tmp_time->relative.y;
|
||||||
dateobj->time->relative.m = tmp_time->relative.m;
|
dateobj->time->relative.m = tmp_time->relative.m;
|
||||||
dateobj->time->relative.d = tmp_time->relative.d;
|
dateobj->time->relative.d = tmp_time->relative.d;
|
||||||
|
|
16
ext/date/tests/bug35499.phpt
Normal file
16
ext/date/tests/bug35499.phpt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #35499 (strtotime() does not handle whitespace around the date string)
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
date_default_timezone_set("UTC");
|
||||||
|
|
||||||
|
echo date(DATE_ISO8601, strtotime("11/20/2005 8:00 AM \r\n")) . "\n";
|
||||||
|
echo date(DATE_ISO8601, strtotime(" 11/20/2005 8:00 AM \r\n")) . "\n";
|
||||||
|
var_dump(strtotime(" a "));
|
||||||
|
var_dump(strtotime(" \n "));
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
2005-11-20T08:00:00+0000
|
||||||
|
2005-11-20T08:00:00+0000
|
||||||
|
bool(false)
|
||||||
|
bool(false)
|
Loading…
Add table
Add a link
Reference in a new issue