Skip to content

Commit 70ad93d

Browse files
committedSep 15, 2022
Fix serialization of empty SplFixedArray
Avoid null pointer deref.
1 parent ef4c20d commit 70ad93d

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed
 

‎ext/spl/spl_fixedarray.c

+9-6
Original file line numberDiff line numberDiff line change
@@ -597,8 +597,9 @@ PHP_METHOD(SplFixedArray, __serialize)
597597
RETURN_THROWS();
598598
}
599599

600-
uint32_t property_num = zend_hash_num_elements(intern->std.properties);
601-
array_init_size(return_value, intern->array.size + property_num);
600+
uint32_t num_properties =
601+
intern->std.properties ? zend_hash_num_elements(intern->std.properties) : 0;
602+
array_init_size(return_value, intern->array.size + num_properties);
602603

603604
/* elements */
604605
for (zend_long i = 0; i < intern->array.size; i++) {
@@ -608,10 +609,12 @@ PHP_METHOD(SplFixedArray, __serialize)
608609
}
609610

610611
/* members */
611-
ZEND_HASH_FOREACH_STR_KEY_VAL(intern->std.properties, key, current) {
612-
zend_hash_add(Z_ARRVAL_P(return_value), key, current);
613-
Z_TRY_ADDREF_P(current);
614-
} ZEND_HASH_FOREACH_END();
612+
if (intern->std.properties) {
613+
ZEND_HASH_FOREACH_STR_KEY_VAL(intern->std.properties, key, current) {
614+
zend_hash_add(Z_ARRVAL_P(return_value), key, current);
615+
Z_TRY_ADDREF_P(current);
616+
} ZEND_HASH_FOREACH_END();
617+
}
615618
}
616619

617620
PHP_METHOD(SplFixedArray, __unserialize)

‎ext/spl/tests/SplFixedArray_serialize.phpt

+6
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ $array->__unserialize([
3838
]);
3939
var_dump($array);
4040

41+
var_dump($s = serialize(new SplFixedArray));
42+
var_dump(unserialize($s));
43+
4144
?>
4245
--EXPECTF--
4346
Deprecated: Creation of dynamic property SplFixedArray::$foo is deprecated in %s on line %d
@@ -71,3 +74,6 @@ object(SplFixedArray)#5 (1) {
7174
[0]=>
7275
NULL
7376
}
77+
string(25) "O:13:"SplFixedArray":0:{}"
78+
object(SplFixedArray)#1 (0) {
79+
}

0 commit comments

Comments
 (0)