summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-11-25 15:57:13 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2019-11-25 15:57:56 +0100
commit717730ddd103c08dd89a47523c96bb97449d0588 (patch)
tree01100569d3c61cf497fa2da51a3288f60b2b1442
parent2ebf530946354e39e3d3df8f96813a06f495f930 (diff)
parent23c65a817390d219bbe77f363cf14956c5c7119b (diff)
downloadphp-git-717730ddd103c08dd89a47523c96bb97449d0588.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix #77638: var_export'ing certain class instances segfaults
-rw-r--r--NEWS3
-rw-r--r--ext/standard/tests/general_functions/bug77638_1.phpt13
-rw-r--r--ext/standard/tests/general_functions/bug77638_2.phpt13
-rw-r--r--ext/standard/var.c4
4 files changed, 31 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index d819e44c4e..38efa2bb61 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,9 @@ PHP NEWS
- PCRE:
. Fixed bug #78853 (preg_match() may return integer > 1). (cmb)
+- Standard:
+ . Fixed bug #77638 (var_export'ing certain class instances segfaults). (cmb)
+
28 Nov 2019, PHP 7.4.0
- Core:
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/tests/general_functions/bug77638_2.phpt b/ext/standard/tests/general_functions/bug77638_2.phpt
new file mode 100644
index 0000000000..b0fbcf724f
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug77638_2.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #77638 (var_export'ing certain class instances segfaults)
+--SKIPIF--
+<?php
+if (!extension_loaded('ffi')) die('skip ffi extension not available');
+?>
+--FILE--
+<?php
+var_export(FFI::new('int'));
+?>
+--EXPECT--
+FFI\CData::__set_state(array(
+))
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 5ba2b3c8eb..c6e9bde9f2 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -557,7 +557,7 @@ again:
zend_release_properties(myht);
return;
} else {
- GC_PROTECT_RECURSION(myht);
+ GC_TRY_PROTECT_RECURSION(myht);
}
}
if (level > 1) {
@@ -577,7 +577,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);
zend_release_properties(myht);
}
if (level > 1) {