result_len = offsets[1] - offsets[0];
*result = estrndup(&subject[offsets[0]], result_len);
}
- zval_dtor(subpats);
- FREE_ZVAL(subpats);
+
+ zval_ptr_dtor(&subpats);
return result_len;
}
--- /dev/null
+--TEST--
+Bug #44214 (crash with preg_replace_callback() and global variable)
+--FILE--
+<?php
+$string = 'aaa bbb ccc ddd eee ccc aaa bbb';
+
+$array = array();
+
+function myCallBack( $match ) {
+ global $array;
+ $array[] = $match;
+ return 'xxx';
+}
+
+var_dump(preg_replace_callback( '`a+`', 'myCallBack', $string));
+var_dump($array);
+?>
+--EXPECT--
+string(31) "xxx bbb ccc ddd eee ccc xxx bbb"
+array(2) {
+ [0]=>
+ array(1) {
+ [0]=>
+ string(3) "aaa"
+ }
+ [1]=>
+ array(1) {
+ [0]=>
+ string(3) "aaa"
+ }
+}
--- /dev/null
+--TEST--
+Bug #44214-2 (crash with preg_replace_callback() and global variable)
+--FILE--
+<?php
+$string = 'aaa bbb ccc ddd eee ccc aaa bbb';
+
+$array = array();
+
+function myCallBack( $match ) {
+ global $array;
+ $array[] = $match[0];
+ return 'xxx';
+}
+
+var_dump(preg_replace_callback( '`a+`', 'myCallBack', $string));
+var_dump($array);
+?>
+--EXPECT--
+string(31) "xxx bbb ccc ddd eee ccc xxx bbb"
+array(2) {
+ [0]=>
+ string(3) "aaa"
+ [1]=>
+ string(3) "aaa"
+}