summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-03-18 17:39:27 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-03-23 13:29:25 +0100
commit47c745555c9000706cd4de7fffc6e1c2f18d5521 (patch)
tree25a0eba4aaeadd8c0612a438f2fc9ba927c29d56
parent51c57a9c677f81bf70e64b2b10d44d04d2cdf0ea (diff)
downloadphp-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--NEWS2
-rw-r--r--ext/spl/spl_fixedarray.c17
-rw-r--r--ext/spl/tests/bug79393.phpt25
3 files changed, 31 insertions, 13 deletions
diff --git a/NEWS b/NEWS
index 5cc62b59b3..10b5b91fe5 100644
--- a/NEWS
+++ b/NEWS
@@ -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