summaryrefslogtreecommitdiff
path: root/ext/pcre
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-03-16 15:40:35 +0800
committerXinchen Hui <laruence@gmail.com>2014-03-16 15:40:35 +0800
commitbf5e00f2e61cbfd2f728d61655fe393be4890299 (patch)
treebc82e88125fd6c4c513a87f4ec9967588b580cf1 /ext/pcre
parent412ca11eda7f15415f1bca0cf72e15f125ce404d (diff)
downloadphp-git-bf5e00f2e61cbfd2f728d61655fe393be4890299.tar.gz
Fixed reference handling in pcre_grep
Diffstat (limited to 'ext/pcre')
-rw-r--r--ext/pcre/php_pcre.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index 969fce2e9e..3298f52fb3 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -1776,9 +1776,10 @@ PHPAPI void php_pcre_grep_impl(pcre_cache_entry *pce, zval *input, zval *return
/* Go through the input array */
zend_hash_internal_pointer_reset(Z_ARRVAL_P(input));
while ((entry = zend_hash_get_current_data(Z_ARRVAL_P(input))) != NULL) {
- zval subject;
+ zval subject, *ref_entry = NULL;
if (Z_TYPE_P(entry) == IS_REFERENCE) {
+ ref_entry = entry;
entry = Z_REFVAL_P(entry);
}
@@ -1806,7 +1807,12 @@ PHPAPI void php_pcre_grep_impl(pcre_cache_entry *pce, zval *input, zval *return
/* If the entry fits our requirements */
if ((count > 0 && !invert) || (count == PCRE_ERROR_NOMATCH && invert)) {
- if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
+ if (ref_entry) {
+ Z_ADDREF_P(ref_entry);
+ entry = ref_entry;
+ } else if (Z_REFCOUNTED_P(entry)) {
+ Z_ADDREF_P(entry);
+ }
/* Add to return array */
switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(input), &string_key, &num_key, 0, NULL))