Skip to content

Commit d2829e6

Browse files
committed
Another round of review fixes
1 parent 4ed345e commit d2829e6

File tree

6 files changed

+48
-64
lines changed

6 files changed

+48
-64
lines changed

ext/spl/spl_fixedarray.c

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ static void spl_fixedarray_init_elems(spl_fixedarray *array, zend_long from, zen
105105
static void spl_fixedarray_init_non_empty_struct(spl_fixedarray *array, zend_long size)
106106
{
107107
array->size = 0; /* reset size in case ecalloc() fails */
108-
array->elements = safe_emalloc(size, sizeof(zval), 0);
108+
array->elements = size ? safe_emalloc(size, sizeof(zval), 0) : NULL;
109109
array->size = size;
110110
array->should_rebuild_properties = true;
111111
}
@@ -590,61 +590,64 @@ PHP_METHOD(SplFixedArray, __wakeup)
590590
PHP_METHOD(SplFixedArray, __serialize)
591591
{
592592
spl_fixedarray_object *intern = Z_SPLFIXEDARRAY_P(ZEND_THIS);
593-
zval *current, tmp;
593+
zval *current;
594+
zend_string *key;
594595

595596
if (zend_parse_parameters_none() == FAILURE) {
596597
RETURN_THROWS();
597598
}
598599

599-
array_init(return_value);
600+
uint32_t property_num = zend_hash_num_elements(intern->std.properties);
601+
array_init_size(return_value, intern->array.size + property_num);
600602

601603
/* elements */
602-
array_init_size(&tmp, intern->array.size);
603-
604604
for (zend_long i = 0; i < intern->array.size; i++) {
605605
current = &intern->array.elements[i];
606-
zend_hash_next_index_insert(Z_ARRVAL(tmp), current);
606+
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), current);
607607
Z_TRY_ADDREF_P(current);
608608
}
609609

610-
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
611-
612610
/* members */
613-
ZVAL_ARR(&tmp, zend_proptable_to_symtable(
614-
zend_std_get_properties(&intern->std), /* always_duplicate */ 1));
615-
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
611+
ZEND_HASH_FOREACH_STR_KEY_VAL(intern->std.properties, key, current) {
612+
zend_hash_str_add(Z_ARRVAL_P(return_value), ZSTR_VAL(key), ZSTR_LEN(key), current);
613+
Z_TRY_ADDREF_P(current);
614+
} ZEND_HASH_FOREACH_END();
616615
}
617616

618617
PHP_METHOD(SplFixedArray, __unserialize)
619618
{
620619
spl_fixedarray_object *intern = Z_SPLFIXEDARRAY_P(ZEND_THIS);
621620
HashTable *data;
622-
zval *storage_zv, *members_zv, *elem;
621+
zval members_zv, *elem;
622+
zend_string *key;
623+
zend_long idx, size, array_size;
623624

624625
if (zend_parse_parameters(ZEND_NUM_ARGS(), "h", &data) == FAILURE) {
625626
RETURN_THROWS();
626627
}
627628

628629
if (intern->array.size == 0) {
629-
storage_zv = zend_hash_index_find(data, 0);
630-
members_zv = zend_hash_index_find(data, 1);
631-
if (!storage_zv || !members_zv ||
632-
Z_TYPE_P(storage_zv) != IS_ARRAY || Z_TYPE_P(members_zv) != IS_ARRAY
633-
) {
634-
zend_throw_exception(spl_ce_UnexpectedValueException,
635-
"Incomplete or ill-typed serialization data", 0);
636-
RETURN_THROWS();
637-
}
638-
639-
zend_long size = zend_hash_num_elements(Z_ARRVAL_P(storage_zv));
630+
size = zend_hash_num_elements(data);
640631
spl_fixedarray_init_non_empty_struct(&intern->array, size);
641-
642-
zend_long i = 0;
643-
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(storage_zv), elem) {
644-
ZVAL_COPY(&intern->array.elements[i++], elem);
632+
array_init(&members_zv);
633+
634+
array_size = 0;
635+
ZEND_HASH_FOREACH_KEY_VAL(data, idx, key, elem) {
636+
if (key == NULL) {
637+
ZVAL_COPY(&intern->array.elements[idx], elem);
638+
array_size++;
639+
} else {
640+
zval tmp;
641+
ZVAL_COPY(&tmp, elem);
642+
zend_hash_add(Z_ARRVAL(members_zv), key, &tmp);
643+
}
645644
} ZEND_HASH_FOREACH_END();
646645

647-
object_properties_load(&intern->std, Z_ARRVAL_P(members_zv));
646+
intern->array.elements = erealloc(intern->array.elements, sizeof(zval) * array_size);
647+
intern->array.size = array_size;
648+
649+
object_properties_load(&intern->std, Z_ARRVAL(members_zv));
650+
zval_ptr_dtor(&members_zv);
648651
}
649652
}
650653

ext/spl/tests/SplFixedArray_serialize.phpt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ $unser[4] = 'quux';
2828
var_dump($unser[4]);
2929
var_dump($unser->foo);
3030

31-
$array = new SplFixedArray(5);
31+
// __unserialize is a no-op on a non-empty SplFixedArray
32+
$array = new SplFixedArray(1);
3233
$array->__unserialize([
33-
[null],
34+
[1],
3435
[
3536
"foo" => "bar",
3637
],
@@ -40,7 +41,7 @@ var_dump($array);
4041
?>
4142
--EXPECTF--
4243
Deprecated: Creation of dynamic property SplFixedArray::$foo is deprecated in %s on line %d
43-
O:13:"SplFixedArray":2:{i:0;a:5:{i:0;s:3:"foo";i:1;N;i:2;i:42;i:3;O:8:"stdClass":1:{s:4:"prop";s:5:"value";}i:4;a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}}i:1;a:1:{s:3:"foo";s:3:"bar";}}
44+
O:13:"SplFixedArray":6:{i:0;s:3:"foo";i:1;N;i:2;i:42;i:3;O:8:"stdClass":1:{s:4:"prop";s:5:"value";}i:4;a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}s:3:"foo";s:3:"bar";}
4445

4546
Deprecated: Creation of dynamic property SplFixedArray::$foo is deprecated in %s on line %d
4647
count: 5
@@ -66,15 +67,7 @@ array(5) {
6667
}
6768
string(4) "quux"
6869
string(3) "bar"
69-
object(SplFixedArray)#5 (5) {
70+
object(SplFixedArray)#5 (1) {
7071
[0]=>
7172
NULL
72-
[1]=>
73-
NULL
74-
[2]=>
75-
NULL
76-
[3]=>
77-
NULL
78-
[4]=>
79-
NULL
8073
}

ext/standard/tests/serialize/bug49649.phpt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ $class = unserialize(base64_decode($serialized));
3434
var_dump($class);
3535
?>
3636
--EXPECTF--
37-
Deprecated: Creation of dynamic property Foo::$private is deprecated in %s on line %d
38-
39-
Deprecated: Creation of dynamic property Foo::$protected is deprecated in %s on line %d
40-
4137
Deprecated: Creation of dynamic property Foo::$notThere is deprecated in %s on line %d
4238
object(Foo)#1 (4) {
4339
["public"]=>

ext/standard/tests/serialize/bug49649_1.phpt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ $class = unserialize(base64_decode($serialized));
3434
var_dump($class);
3535
?>
3636
--EXPECTF--
37-
Deprecated: Creation of dynamic property Foo::$private is deprecated in %s on line %d
38-
39-
Deprecated: Creation of dynamic property Foo::$public is deprecated in %s on line %d
40-
4137
Deprecated: Creation of dynamic property Foo::$notThere is deprecated in %s on line %d
4238
object(Foo)#1 (4) {
4339
["public":protected]=>

ext/standard/tests/serialize/bug49649_2.phpt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ $class = unserialize(base64_decode($serialized));
3434
var_dump($class);
3535
?>
3636
--EXPECTF--
37-
Deprecated: Creation of dynamic property Foo::$protected is deprecated in %s on line %d
38-
39-
Deprecated: Creation of dynamic property Foo::$public is deprecated in %s on line %d
40-
4137
Deprecated: Creation of dynamic property Foo::$notThere is deprecated in %s on line %d
4238
object(Foo)#1 (4) {
4339
["public":"Foo":private]=>

ext/standard/var_unserializer.re

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -638,18 +638,6 @@ declared_property:
638638
}
639639
}
640640
} else {
641-
if (UNEXPECTED(obj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) {
642-
zend_throw_error(NULL, "Cannot create dynamic property %s::$%s",
643-
ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key)));
644-
goto failure;
645-
} else if (!(obj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
646-
zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated",
647-
ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key)));
648-
if (EG(exception)) {
649-
goto failure;
650-
}
651-
}
652-
653641
int ret = is_property_visibility_changed(obj->ce, &key);
654642

655643
if (EXPECTED(!ret)) {
@@ -666,6 +654,18 @@ second_try:
666654
ZVAL_NULL(data);
667655
}
668656
}
657+
658+
if (UNEXPECTED(obj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) {
659+
zend_throw_error(NULL, "Cannot create dynamic property %s::$%s",
660+
ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key)));
661+
goto failure;
662+
} else if (!(obj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
663+
zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated",
664+
ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key)));
665+
if (EG(exception)) {
666+
goto failure;
667+
}
668+
}
669669
}
670670
zval_ptr_dtor_str(&key);
671671
} else if (Z_TYPE(key) == IS_LONG) {

0 commit comments

Comments
 (0)