Skip to content

Commit a92ecdb

Browse files
committed
Merge branch 'PHP-8.2'
2 parents 984484a + b463bc4 commit a92ecdb

File tree

7 files changed

+54
-6
lines changed

7 files changed

+54
-6
lines changed

Diff for: .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

Diff for: ext/date/php_date.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -2735,6 +2735,7 @@ PHP_METHOD(DateTime, __set_state)
27352735
dateobj = Z_PHPDATE_P(return_value);
27362736
if (!php_date_initialize_from_hash(&dateobj, myht)) {
27372737
zend_throw_error(NULL, "Invalid serialization data for DateTime object");
2738+
RETURN_THROWS();
27382739
}
27392740
}
27402741
/* }}} */
@@ -2756,6 +2757,7 @@ PHP_METHOD(DateTimeImmutable, __set_state)
27562757
dateobj = Z_PHPDATE_P(return_value);
27572758
if (!php_date_initialize_from_hash(&dateobj, myht)) {
27582759
zend_throw_error(NULL, "Invalid serialization data for DateTimeImmutable object");
2760+
RETURN_THROWS();
27592761
}
27602762
}
27612763
/* }}} */
@@ -2818,7 +2820,7 @@ static void restore_custom_datetime_properties(zval *object, HashTable *myht)
28182820
zval *prop_val;
28192821

28202822
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
2821-
if (date_time_is_internal_property(prop_name)) {
2823+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_time_is_internal_property(prop_name)) {
28222824
continue;
28232825
}
28242826
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);
@@ -2842,6 +2844,7 @@ PHP_METHOD(DateTime, __unserialize)
28422844

28432845
if (!php_date_initialize_from_hash(&dateobj, myht)) {
28442846
zend_throw_error(NULL, "Invalid serialization data for DateTime object");
2847+
RETURN_THROWS();
28452848
}
28462849

28472850
restore_custom_datetime_properties(object, myht);
@@ -2865,6 +2868,7 @@ PHP_METHOD(DateTimeImmutable, __unserialize)
28652868

28662869
if (!php_date_initialize_from_hash(&dateobj, myht)) {
28672870
zend_throw_error(NULL, "Invalid serialization data for DateTimeImmutable object");
2871+
RETURN_THROWS();
28682872
}
28692873

28702874
restore_custom_datetime_properties(object, myht);
@@ -3918,7 +3922,7 @@ static void restore_custom_datetimezone_properties(zval *object, HashTable *myht
39183922
zval *prop_val;
39193923

39203924
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
3921-
if (date_timezone_is_internal_property(prop_name)) {
3925+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_timezone_is_internal_property(prop_name)) {
39223926
continue;
39233927
}
39243928
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);
@@ -4545,7 +4549,7 @@ static void restore_custom_dateinterval_properties(zval *object, HashTable *myht
45454549
zval *prop_val;
45464550

45474551
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
4548-
if (date_interval_is_internal_property(prop_name)) {
4552+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_interval_is_internal_property(prop_name)) {
45494553
continue;
45504554
}
45514555
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);
@@ -5545,7 +5549,7 @@ static void restore_custom_dateperiod_properties(zval *object, HashTable *myht)
55455549
zval *prop_val;
55465550

55475551
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
5548-
if (date_period_is_internal_property(prop_name)) {
5552+
if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_period_is_internal_property(prop_name)) {
55495553
continue;
55505554
}
55515555
add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val);

Diff for: 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;

Diff for: 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;

Diff for: ext/date/tests/ossfuzz-55727.txt

512 Bytes
Binary file not shown.

Diff for: 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)

Diff for: main/snprintf.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,8 @@ static size_t format_converter(buffy * odp, const char *fmt, va_list ap) /* {{{
580580
} else if (*fmt == '*') {
581581
precision = va_arg(ap, int);
582582
fmt++;
583-
if (precision < 0)
584-
precision = 0;
583+
if (precision < -1)
584+
precision = -1;
585585
} else
586586
precision = 0;
587587
} else

0 commit comments

Comments
 (0)