Skip to content

Commit 684ddd3

Browse files
committed
GH-8458: DateInterval::createFromDateString does not throw non-relative items are present
1 parent f590782 commit 684ddd3

File tree

4 files changed

+53
-9
lines changed

4 files changed

+53
-9
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ PHP NEWS
1414
- Curl:
1515
. Added support for CURLOPT_XFERINFOFUNCTION. (David Carlier)
1616

17+
- Date:
18+
. Fixed GH-8458 (DateInterval::createFromDateString does not throw if
19+
non-relative items are present). (Derick)
20+
1721
- FPM:
1822
. Emit error for invalid port setting. (David Carlier)
1923
. Added extra check for FPM proc dumpable on SELinux based systems.

ext/date/php_date.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4333,6 +4333,12 @@ PHP_FUNCTION(date_interval_create_from_date_string)
43334333
goto cleanup;
43344334
}
43354335

4336+
if (time->have_date || time->have_time || time->have_zone) {
4337+
php_error_docref(NULL, E_WARNING, "String '%s' contains non-relative elements", ZSTR_VAL(time_str));
4338+
RETVAL_FALSE;
4339+
goto cleanup;
4340+
}
4341+
43364342
php_date_instantiate(date_ce_interval, return_value);
43374343
diobj = Z_PHPINTERVAL_P(return_value);
43384344
diobj->diff = timelib_rel_time_clone(&time->relative);

ext/date/tests/DateInterval_serialize-003.phpt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ Test DateInterval::__serialize and DateInterval::__unserialize
44
<?php
55
date_default_timezone_set("Europe/London");
66

7-
// the 15:30 gets ignored, as it's not a "relative" interval.
8-
// See: https://github.com/php/php-src/issues/8458
9-
$d = DateInterval::createFromDateString('next weekday 15:30');
7+
$d = DateInterval::createFromDateString('next weekday');
108
echo "Original object:\n";
119
var_dump($d);
1210

@@ -26,7 +24,7 @@ $d = new DateInterval('P2Y4DT6H8M');
2624
$d->__unserialize(
2725
[
2826
'from_string' => true,
29-
'date_string' => 'next weekday 15:30',
27+
'date_string' => 'next weekday',
3028
]
3129
);
3230
var_dump($d);
@@ -42,20 +40,20 @@ object(DateInterval)#1 (%d) {
4240
["from_string"]=>
4341
bool(true)
4442
["date_string"]=>
45-
string(18) "next weekday 15:30"
43+
string(%d) "next weekday"
4644
}
4745

4846

4947
Serialised object:
50-
string(92) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:18:"next weekday 15:30";}"
48+
string(%d) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:%d:"next weekday";}"
5149

5250

5351
Unserialised object:
5452
object(DateInterval)#2 (2) {
5553
["from_string"]=>
5654
bool(true)
5755
["date_string"]=>
58-
string(18) "next weekday 15:30"
56+
string(%d) "next weekday"
5957
}
6058

6159

@@ -64,7 +62,7 @@ array(2) {
6462
["from_string"]=>
6563
bool(true)
6664
["date_string"]=>
67-
string(18) "next weekday 15:30"
65+
string(%d) "next weekday"
6866
}
6967

7068

@@ -73,7 +71,7 @@ object(DateInterval)#3 (2) {
7371
["from_string"]=>
7472
bool(true)
7573
["date_string"]=>
76-
string(18) "next weekday 15:30"
74+
string(%d) "next weekday"
7775
}
7876

7977

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
GH-8458 (DateInterval::createFromDateString does not warn when non-relative items are present)
3+
--FILE--
4+
<?php
5+
$formats = [
6+
'next weekday 15:30',
7+
'+5 hours noon',
8+
'-8 days March 23',
9+
'+72 seconds UTC',
10+
];
11+
12+
foreach ($formats as $format) {
13+
$d = DateInterval::createFromDateString($format);
14+
}
15+
16+
foreach ($formats as $format) {
17+
$d = date_interval_create_from_date_string($format);
18+
}
19+
20+
?>
21+
--EXPECTF--
22+
Warning: DateInterval::createFromDateString(): String 'next weekday 15:30' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
23+
24+
Warning: DateInterval::createFromDateString(): String '+5 hours noon' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
25+
26+
Warning: DateInterval::createFromDateString(): String '-8 days March 23' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
27+
28+
Warning: DateInterval::createFromDateString(): String '+72 seconds UTC' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
29+
30+
Warning: date_interval_create_from_date_string(): String 'next weekday 15:30' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
31+
32+
Warning: date_interval_create_from_date_string(): String '+5 hours noon' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
33+
34+
Warning: date_interval_create_from_date_string(): String '-8 days March 23' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d
35+
36+
Warning: date_interval_create_from_date_string(): String '+72 seconds UTC' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d

0 commit comments

Comments
 (0)