summaryrefslogtreecommitdiff
path: root/ext/pcre
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-10-11 06:46:18 +0000
committerDmitry Stogov <dmitry@php.net>2005-10-11 06:46:18 +0000
commit866908ca97d554cee91964695e4bc0be1f36d824 (patch)
tree4b250f696107e0effe1098dbc1a61b4ab0462a27 /ext/pcre
parent2892b13bb9108bb42921ef69f8cf1dcbd30dc9d2 (diff)
downloadphp-git-866908ca97d554cee91964695e4bc0be1f36d824.tar.gz
Fixed bug #34790 (preg_match_all(), named capturing groups, variable assignment/return => crash)
Diffstat (limited to 'ext/pcre')
-rw-r--r--ext/pcre/php_pcre.c1
-rwxr-xr-xext/pcre/tests/bug34790.phpt23
2 files changed, 24 insertions, 0 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index a0846214ba..e10b6f4988 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -620,6 +620,7 @@ static void php_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global)
if (subpat_names[i]) {
zend_hash_update(Z_ARRVAL_P(subpats), subpat_names[i],
strlen(subpat_names[i])+1, &match_sets[i], sizeof(zval *), NULL);
+ ZVAL_ADDREF(match_sets[i]);
}
zend_hash_next_index_insert(Z_ARRVAL_P(subpats), &match_sets[i], sizeof(zval *), NULL);
}
diff --git a/ext/pcre/tests/bug34790.phpt b/ext/pcre/tests/bug34790.phpt
new file mode 100755
index 0000000000..c375ae5ac8
--- /dev/null
+++ b/ext/pcre/tests/bug34790.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #34790 (preg_match_all(), named capturing groups, variable assignment/return => crash)
+--FILE--
+<?php
+function func1(){
+ $string = 'what the word and the other word the';
+ preg_match_all('/(?P<word>the)/', $string, $matches);
+ return $matches['word'];
+}
+$words = func1();
+var_dump($words);
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ string(3) "the"
+ [1]=>
+ string(3) "the"
+ [2]=>
+ string(3) "the"
+ [3]=>
+ string(3) "the"
+}