Skip to content

Commit 5d9ee8f

Browse files
committed
Fixed OSS fuzz issues #55589, #55599, and #55727
1 parent 81aedad commit 5d9ee8f

File tree

6 files changed

+52
-4
lines changed

6 files changed

+52
-4
lines changed

.gitattributes

+3
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@
2323
**/*_arginfo.h linguist-generated
2424
/Zend/zend_vm_execute.h linguist-generated
2525
/Zend/zend_vm_opcodes.{h,c} linguist-generated
26+
27+
# The OSS fuzz files are bunary
28+
/ext/date/tests/ossfuzz*.txt binary

ext/date/php_date.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -2706,6 +2706,7 @@ PHP_METHOD(DateTime, __set_state)
27062706
dateobj = Z_PHPDATE_P(return_value);
27072707
if (!php_date_initialize_from_hash(&dateobj, myht)) {
27082708
zend_throw_error(NULL, "Invalid serialization data for DateTime object");
2709+
RETURN_THROWS();
27092710
}
27102711
}
27112712
/* }}} */
@@ -2727,6 +2728,7 @@ PHP_METHOD(DateTimeImmutable, __set_state)
27272728
dateobj = Z_PHPDATE_P(return_value);
27282729
if (!php_date_initialize_from_hash(&dateobj, myht)) {
27292730
zend_throw_error(NULL, "Invalid serialization data for DateTimeImmutable object");
2731+
RETURN_THROWS();
27302732
}
27312733
}
27322734
/* }}} */
@@ -2789,7 +2791,7 @@ static void restore_custom_datetime_properties(zval *object, HashTable *myht)
27892791
zval *prop_val;
27902792

27912793
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
2792-
if (date_time_is_internal_property(prop_name)) {
2794+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_time_is_internal_property(prop_name)) {
27932795
continue;
27942796
}
27952797
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);
@@ -2813,6 +2815,7 @@ PHP_METHOD(DateTime, __unserialize)
28132815

28142816
if (!php_date_initialize_from_hash(&dateobj, myht)) {
28152817
zend_throw_error(NULL, "Invalid serialization data for DateTime object");
2818+
RETURN_THROWS();
28162819
}
28172820

28182821
restore_custom_datetime_properties(object, myht);
@@ -2836,6 +2839,7 @@ PHP_METHOD(DateTimeImmutable, __unserialize)
28362839

28372840
if (!php_date_initialize_from_hash(&dateobj, myht)) {
28382841
zend_throw_error(NULL, "Invalid serialization data for DateTimeImmutable object");
2842+
RETURN_THROWS();
28392843
}
28402844

28412845
restore_custom_datetime_properties(object, myht);
@@ -3821,7 +3825,7 @@ static void restore_custom_datetimezone_properties(zval *object, HashTable *myht
38213825
zval *prop_val;
38223826

38233827
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
3824-
if (date_timezone_is_internal_property(prop_name)) {
3828+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_timezone_is_internal_property(prop_name)) {
38253829
continue;
38263830
}
38273831
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);
@@ -4449,7 +4453,7 @@ static void restore_custom_dateinterval_properties(zval *object, HashTable *myht
44494453
zval *prop_val;
44504454

44514455
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
4452-
if (date_interval_is_internal_property(prop_name)) {
4456+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_interval_is_internal_property(prop_name)) {
44534457
continue;
44544458
}
44554459
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);
@@ -5411,7 +5415,7 @@ static void restore_custom_dateperiod_properties(zval *object, HashTable *myht)
54115415
zval *prop_val;
54125416

54135417
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
5414-
if (date_period_is_internal_property(prop_name)) {
5418+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_period_is_internal_property(prop_name)) {
54155419
continue;
54165420
}
54175421
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);

ext/date/tests/ossfuzz-55589.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
|O:12:"DaTeInterval":2:{i:2;r:1;i:0;R:2;

ext/date/tests/ossfuzz-55599.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
|O:8:"DateTime":1:{i:1;d:2;

ext/date/tests/ossfuzz-55727.txt

512 Bytes
Binary file not shown.

ext/date/tests/unserialize-test.phpt

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
Test DateInterval::__unserialize OSS fuzz issues
3+
--FILE--
4+
<?php
5+
$files = [
6+
'ossfuzz-55589.txt',
7+
'ossfuzz-55599.txt',
8+
'ossfuzz-55727.txt',
9+
];
10+
11+
foreach ($files as $file) {
12+
echo "{$file}: ";
13+
14+
$s = file_get_contents(__DIR__ . "/{$file}");
15+
16+
try {
17+
$x = unserialize(substr($s, strpos($s, "|") + 1));
18+
} catch (Error $e) {
19+
echo get_class($e), ': ', $e->getMessage(), "\n";
20+
}
21+
var_dump($x);
22+
echo "\n\n";
23+
}
24+
?>
25+
--EXPECTF--
26+
ossfuzz-55589.txt:
27+
%s: unserialize(): Error at offset 39 of 39 bytes in %sunserialize-test.php on line 14
28+
bool(false)
29+
30+
31+
ossfuzz-55599.txt:
32+
%s: unserialize(): Error at offset 26 of 26 bytes in %sunserialize-test.php on line 14
33+
Error: Invalid serialization data for DateTime object
34+
bool(false)
35+
36+
37+
ossfuzz-55727.txt:
38+
%s: unserialize(): Error at offset 230 of 509 bytes in %sunserialize-test.php on line 14
39+
bool(false)

0 commit comments

Comments
 (0)