Skip to content

Commit 1400f4a

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #79015: undefined-behavior in php_date.c
2 parents 54ec44a + 40b2f82 commit 1400f4a

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

ext/date/php_date.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4020,14 +4020,16 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter
40204020
PHP_DATE_INTERVAL_READ_PROPERTY("h", h, timelib_sll, -1)
40214021
PHP_DATE_INTERVAL_READ_PROPERTY("i", i, timelib_sll, -1)
40224022
PHP_DATE_INTERVAL_READ_PROPERTY("s", s, timelib_sll, -1)
4023-
do {
4023+
{
40244024
zval *z_arg = zend_hash_str_find(myht, "f", sizeof("f") - 1);
4025+
(*intobj)->diff->us = -1000000;
40254026
if (z_arg) {
4026-
(*intobj)->diff->us = ((double)zval_get_double(z_arg) * 1000000);
4027-
} else {
4028-
(*intobj)->diff->us = (double) -1000000;
4027+
double val = zval_get_double(z_arg) * 1000000;
4028+
if (val >= 0 && val < 1000000) {
4029+
(*intobj)->diff->us = val;
4030+
}
40294031
}
4030-
} while (0);
4032+
}
40314033
PHP_DATE_INTERVAL_READ_PROPERTY("weekday", weekday, int, -1)
40324034
PHP_DATE_INTERVAL_READ_PROPERTY("weekday_behavior", weekday_behavior, int, -1)
40334035
PHP_DATE_INTERVAL_READ_PROPERTY("first_last_day_of", first_last_day_of, int, -1)

ext/date/tests/bug79015.phpt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
--TEST--
2+
Bug #79015 (undefined-behavior in php_date.c)
3+
--FILE--
4+
<?php
5+
$payload = 'O:12:"DateInterval":16:{s:1:"y";i:1;s:1:"m";i:0;s:1:"d";i:4;s:1:"h";i:0;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";i:9999999999990;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";b:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}';
6+
var_dump(unserialize($payload));
7+
?>
8+
--EXPECTF--
9+
object(DateInterval)#%d (16) {
10+
["y"]=>
11+
int(1)
12+
["m"]=>
13+
int(0)
14+
["d"]=>
15+
int(4)
16+
["h"]=>
17+
int(0)
18+
["i"]=>
19+
int(0)
20+
["s"]=>
21+
int(0)
22+
["f"]=>
23+
float(-1)
24+
["weekday"]=>
25+
int(0)
26+
["weekday_behavior"]=>
27+
int(0)
28+
["first_last_day_of"]=>
29+
int(0)
30+
["invert"]=>
31+
int(0)
32+
["days"]=>
33+
bool(false)
34+
["special_type"]=>
35+
int(0)
36+
["special_amount"]=>
37+
int(0)
38+
["have_weekday_relative"]=>
39+
int(0)
40+
["have_special_relative"]=>
41+
int(0)
42+
}

0 commit comments

Comments
 (0)