]> granicus.if.org Git - php/commitdiff
Fixed reference handling in pcre_grep
authorXinchen Hui <laruence@gmail.com>
Sun, 16 Mar 2014 07:40:35 +0000 (15:40 +0800)
committerXinchen Hui <laruence@gmail.com>
Sun, 16 Mar 2014 07:40:35 +0000 (15:40 +0800)
ext/pcre/php_pcre.c

index 969fce2e9e1b1a96e6fda8d04722614154feaae9..3298f52fb384d8fc3f6279a383df13da22bb0a49 100644 (file)
@@ -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))