summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2015-09-02 22:14:48 -0700
committerXinchen Hui <laruence@gmail.com>2015-09-02 22:14:48 -0700
commitd5b78cec641173f3e37b9bad1e575fb5b646196c (patch)
treee73ecc91613ac723b72a9b26969885f8aeba3ab7
parent6815c08e2939f49a2ac9087924d58448edb401ba (diff)
downloadphp-git-d5b78cec641173f3e37b9bad1e575fb5b646196c.tar.gz
We should keep one refcount to resource
-rw-r--r--Zend/tests/bug70398.phpt17
-rw-r--r--Zend/zend_builtin_functions.c5
2 files changed, 12 insertions, 10 deletions
diff --git a/Zend/tests/bug70398.phpt b/Zend/tests/bug70398.phpt
index 8c0b1ab249..6f7b6f3844 100644
--- a/Zend/tests/bug70398.phpt
+++ b/Zend/tests/bug70398.phpt
@@ -5,13 +5,14 @@ Bug #70398 (SIGSEGV, Segmentation fault zend_ast_destroy_ex)
define("FILE_STREAM", fopen("php://temp", "r"));
+define("FILE_STREAMS", array(fopen("php://temp", "r")));
-$array = array(
- fopen("php://temp", "r"),
-);
-
-define("FILE_STREAMS", $array);
+var_dump(FILE_STREAM);
+var_dump(FILE_STREAMS);
?>
-OK
---EXPECT--
-OK
+--EXPECTF--
+resource(%d) of type (stream)
+array(1) {
+ [0]=>
+ resource(%d) of type (stream)
+}
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 818cc54dd0..e3f087b356 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -780,10 +780,11 @@ static void copy_constant_array(zval *dst, zval *src) /* {{{ */
if (!Z_IMMUTABLE_P(val)) {
copy_constant_array(new_val, val);
}
- } else if (Z_TYPE_INFO_P(val) == IS_RESOURCE_EX) {
- Z_TYPE_INFO_P(new_val) &= ~(IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT);
} else if (Z_REFCOUNTED_P(val)) {
Z_ADDREF_P(val);
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_RESOURCE_EX)) {
+ Z_TYPE_INFO_P(new_val) &= ~(IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT);
+ }
}
} ZEND_HASH_FOREACH_END();
}