summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-02-08 16:56:30 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-02-08 17:05:29 +0100
commitf649adedfe3f0797cd0d6248e1b01c65b326f443 (patch)
tree3101ea86c5b319bca956fff2a53785a14f9fa60d
parent674d44ad7c03a0f815b00c8849e104676a398651 (diff)
downloadphp-git-f649adedfe3f0797cd0d6248e1b01c65b326f443.tar.gz
Fix #79248: Traversing empty VT_ARRAY throws com_exception
If the `VT_ARRAY` is empty, i.e. its upperbound is less than its lower bound, we must not call `php_com_safearray_get_elem()`, because that function throws in this case.
-rw-r--r--NEWS1
-rw-r--r--ext/com_dotnet/com_iterator.c2
-rw-r--r--ext/com_dotnet/tests/bug79248.phpt16
3 files changed, 18 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 86a6be63b4..398f685bf3 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP NEWS
(cmb)
. Fixed bug #79242 (COM error constants don't match com_exception codes on
x86). (cmb)
+ . Fixed bug #79248 (Traversing empty VT_ARRAY throws com_exception). (cmb)
- PCRE:
. Fixed bug #79188 (Memory corruption in preg_replace/preg_replace_callback
diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c
index e0d217b395..5b731777e0 100644
--- a/ext/com_dotnet/com_iterator.c
+++ b/ext/com_dotnet/com_iterator.c
@@ -187,7 +187,7 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int b
SafeArrayGetUBound(V_ARRAY(&I->safe_array), 1, &I->sa_max);
/* pre-fetch the element */
- if (php_com_safearray_get_elem(&I->safe_array, &I->v, bound)) {
+ if (I->sa_max >= bound && php_com_safearray_get_elem(&I->safe_array, &I->v, bound)) {
I->key = bound;
ZVAL_NULL(&ptr);
php_com_zval_from_variant(&ptr, &I->v, I->code_page);
diff --git a/ext/com_dotnet/tests/bug79248.phpt b/ext/com_dotnet/tests/bug79248.phpt
new file mode 100644
index 0000000000..fda67551a7
--- /dev/null
+++ b/ext/com_dotnet/tests/bug79248.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #79248 (Traversing empty VT_ARRAY throws com_exception)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
+?>
+--FILE--
+<?php
+$v = new variant([], VT_ARRAY);
+foreach ($v as $el) {
+ var_dump($el);
+}
+echo "done\n";
+?>
+--EXPECT--
+done