Skip to content

Commit 40b2f82

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix #79015: undefined-behavior in php_date.c
2 parents 3e5675d + b48f262 commit 40b2f82

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ PHP NEWS
2020
- CURL:
2121
. Fixed bug #79033 (Curl timeout error with specific url and post). (cmb)
2222

23+
- Date:
24+
. Fixed bug #79015 (undefined-behavior in php_date.c). (cmb)
25+
2326
- Exif:
2427
. Fixed bug #79046 (NaN to int cast undefined behavior in exif). (Nikita)
2528

ext/date/php_date.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4426,14 +4426,16 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter
44264426
PHP_DATE_INTERVAL_READ_PROPERTY("h", h, timelib_sll, -1)
44274427
PHP_DATE_INTERVAL_READ_PROPERTY("i", i, timelib_sll, -1)
44284428
PHP_DATE_INTERVAL_READ_PROPERTY("s", s, timelib_sll, -1)
4429-
do {
4429+
{
44304430
zval *z_arg = zend_hash_str_find(myht, "f", sizeof("f") - 1);
4431+
(*intobj)->diff->us = -1000000;
44314432
if (z_arg) {
4432-
(*intobj)->diff->us = ((double)zval_get_double(z_arg) * 1000000);
4433-
} else {
4434-
(*intobj)->diff->us = (double) -1000000;
4433+
double val = zval_get_double(z_arg) * 1000000;
4434+
if (val >= 0 && val < 1000000) {
4435+
(*intobj)->diff->us = val;
4436+
}
44354437
}
4436-
} while (0);
4438+
}
44374439
PHP_DATE_INTERVAL_READ_PROPERTY("weekday", weekday, int, -1)
44384440
PHP_DATE_INTERVAL_READ_PROPERTY("weekday_behavior", weekday_behavior, int, -1)
44394441
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)