Skip to content

Commit fbe218d

Browse files
committed
GH-8458: DateInterval::createFromDateString does not throw non-relative items are present
1 parent 9a90bd7 commit fbe218d

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-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: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4325,6 +4325,11 @@ PHP_FUNCTION(date_interval_create_from_date_string)
43254325
goto cleanup;
43264326
}
43274327

4328+
if (time->have_date || time->have_time || time->have_zone) {
4329+
zend_throw_exception_ex(NULL, 0, "String '%s' contains non-relative elements", ZSTR_VAL(time_str));
4330+
goto cleanup;
4331+
}
4332+
43284333
php_date_instantiate(date_ce_interval, return_value);
43294334
diobj = Z_PHPINTERVAL_P(return_value);
43304335
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: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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+
try {
14+
$d = DateInterval::createFromDateString($format);
15+
} catch(Throwable $t) {
16+
echo $t->getMessage(), "\n";
17+
}
18+
}
19+
20+
?>
21+
--EXPECTF--
22+
String 'next weekday 15:30' contains non-relative elements
23+
String '+5 hours noon' contains non-relative elements
24+
String '-8 days March 23' contains non-relative elements
25+
String '+72 seconds UTC' contains non-relative elements

0 commit comments

Comments
 (0)