summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-11-25 15:44:15 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2019-11-25 15:54:11 +0100
commit23c65a817390d219bbe77f363cf14956c5c7119b (patch)
treebc9b87a91a67d457abc2b6afaf92768fcc79031c
parentbb30fe9e2b86a46a167c88daaae0c650cb01afa2 (diff)
downloadphp-git-23c65a817390d219bbe77f363cf14956c5c7119b.tar.gz
Fix #77638: var_export'ing certain class instances segfaults
If objects return immutable property hash tables (typically, `zend_empty_array`), we must not try to apply recursion protection on those.
-rw-r--r--NEWS1
-rw-r--r--ext/standard/tests/general_functions/bug77638_1.phpt13
-rw-r--r--ext/standard/var.c4
3 files changed, 16 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 2961969c61..4f02519711 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,7 @@ PHP NEWS
- Standard:
. Fixed bug #78759 (array_search in $GLOBALS). (Nikita)
+ . Fixed bug #77638 (var_export'ing certain class instances segfaults). (cmb)
21 Nov 2019, PHP 7.3.12
diff --git a/ext/standard/tests/general_functions/bug77638_1.phpt b/ext/standard/tests/general_functions/bug77638_1.phpt
new file mode 100644
index 0000000000..b5ad2b6acf
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug77638_1.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #77638 (var_export'ing certain class instances segfaults)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
+?>
+--FILE--
+<?php
+var_export(new COM("Scripting.Dictionary"));
+?>
+--EXPECT--
+com::__set_state(array(
+))
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 2562a410f0..a008aab4cb 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -524,7 +524,7 @@ again:
zend_error(E_WARNING, "var_export does not handle circular references");
return;
} else {
- GC_PROTECT_RECURSION(myht);
+ GC_TRY_PROTECT_RECURSION(myht);
}
}
if (level > 1) {
@@ -544,7 +544,7 @@ again:
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) {
php_object_element_export(val, index, key, level, buf);
} ZEND_HASH_FOREACH_END();
- GC_UNPROTECT_RECURSION(myht);
+ GC_TRY_UNPROTECT_RECURSION(myht);
}
if (level > 1) {
buffer_append_spaces(buf, level - 1);