diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-03-18 17:39:27 +0100 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-03-23 13:29:25 +0100 |
commit | 47c745555c9000706cd4de7fffc6e1c2f18d5521 (patch) | |
tree | 25a0eba4aaeadd8c0612a438f2fc9ba927c29d56 | |
parent | 51c57a9c677f81bf70e64b2b10d44d04d2cdf0ea (diff) | |
download | php-git-47c745555c9000706cd4de7fffc6e1c2f18d5521.tar.gz |
Fix #79393: Null coalescing operator failing with SplFixedArray
We favor the KISS principle over optimization[1] – SPL is already
special enough.
[1] <https://github.com/php/php-src/pull/2489/commits/352f3d4476a79bb86136b431719df7394e5a8d4e#r112498098>ff
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/spl/spl_fixedarray.c | 17 | ||||
-rw-r--r-- | ext/spl/tests/bug79393.phpt | 25 |
3 files changed, 31 insertions, 13 deletions
@@ -18,6 +18,8 @@ PHP NEWS - Spl: . Fixed bug #75673 (SplStack::unserialize() behavior). (cmb) + . Fixed bug #79393 (Null coalescing operator failing with SplFixedArray). + (cmb) - Zip: . Fixed Bug #79296 (ZipArchive::open fails on empty file). (Remi) diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 392175f781..488731aa1f 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -336,25 +336,16 @@ static inline zval *spl_fixedarray_object_read_dimension_helper(spl_fixedarray_o } /* }}} */ +static int spl_fixedarray_object_has_dimension(zval *object, zval *offset, int check_empty); + static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */ { spl_fixedarray_object *intern; intern = Z_SPLFIXEDARRAY_P(object); - if (type == BP_VAR_IS && intern->fptr_offset_has) { - SEPARATE_ARG_IF_REF(offset); - zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_has, "offsetexists", rv, offset); - if (UNEXPECTED(Z_ISUNDEF_P(rv))) { - zval_ptr_dtor(offset); - return NULL; - } - if (!i_zend_is_true(rv)) { - zval_ptr_dtor(offset); - zval_ptr_dtor(rv); - return &EG(uninitialized_zval); - } - zval_ptr_dtor(rv); + if (type == BP_VAR_IS && !spl_fixedarray_object_has_dimension(object, offset, 0)) { + return &EG(uninitialized_zval); } if (intern->fptr_offset_get) { diff --git a/ext/spl/tests/bug79393.phpt b/ext/spl/tests/bug79393.phpt new file mode 100644 index 0000000000..e8036c70a0 --- /dev/null +++ b/ext/spl/tests/bug79393.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #79393 (Null coalescing operator failing with SplFixedArray) +--FILE-- +<?php +$foo = new SplFixedArray(5); +$foo[0] = 'bar1'; +$foo[1] = 'bar2'; +$foo[2] = 0; +$foo[3] = false; +$foo[4] = ''; + +var_dump($foo[0] ?? null); +var_dump($foo[1] ?? null); +var_dump($foo[2] ?? null); +var_dump($foo[3] ?? null); +var_dump($foo[4] ?? null); +var_dump($foo[5] ?? null); +?> +--EXPECT-- +string(4) "bar1" +string(4) "bar2" +int(0) +bool(false) +string(0) "" +NULL |