summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/pcre/php_pcre.c8
-rw-r--r--ext/pcre/tests/bug70345.phpt8
-rw-r--r--ext/pcre/tests/bug76127.phpt10
-rw-r--r--ext/pcre/tests/split2.phpt5
4 files changed, 20 insertions, 11 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index 04e5d858c3..37e0b0c68b 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -2500,7 +2500,8 @@ PHPAPI void php_pcre_split_impl(pcre_cache_entry *pce, zend_string *subject_str,
match_data = pcre2_match_data_create_from_pattern(pce->re, gctx);
if (!match_data) {
PCRE_G(error_code) = PHP_PCRE_INTERNAL_ERROR;
- return;
+ zval_ptr_dtor(return_value);
+ RETURN_FALSE;
}
}
@@ -2620,6 +2621,11 @@ error:
pcre2_match_data_free(match_data);
}
+ if (PCRE_G(error_code) != PHP_PCRE_NO_ERROR) {
+ zval_ptr_dtor(return_value);
+ RETURN_FALSE;
+ }
+
last:
start_offset = (last_match - ZSTR_VAL(subject_str)); /* the offset might have been incremented, but without further successful matches */
diff --git a/ext/pcre/tests/bug70345.phpt b/ext/pcre/tests/bug70345.phpt
index 0947ba3daa..187a3e1e6f 100644
--- a/ext/pcre/tests/bug70345.phpt
+++ b/ext/pcre/tests/bug70345.phpt
@@ -5,8 +5,7 @@ Bug #70345 (Multiple vulnerabilities related to PCRE functions)
$regex = '/(?=xyz\K)/';
$subject = "aaaaxyzaaaa";
-$v = preg_split($regex, $subject);
-print_r($v);
+var_dump(preg_split($regex, $subject));
$regex = '/(a(?=xyz\K))/';
$subject = "aaaaxyzaaaa";
@@ -14,10 +13,7 @@ preg_match($regex, $subject, $matches);
var_dump($matches);
--EXPECTF--
-Array
-(
- [0] => aaaaxyzaaaa
-)
+bool(false)
Warning: preg_match(): Get subpatterns list failed in %s on line %d
array(0) {
diff --git a/ext/pcre/tests/bug76127.phpt b/ext/pcre/tests/bug76127.phpt
new file mode 100644
index 0000000000..710a221692
--- /dev/null
+++ b/ext/pcre/tests/bug76127.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Bug #76127: preg_split does not raise an error on invalid UTF-8
+--FILE--
+<?php
+var_dump(preg_split("/a/u", "a\xff"));
+var_dump(preg_last_error() == PREG_BAD_UTF8_ERROR);
+?>
+--EXPECT--
+bool(false)
+bool(true)
diff --git a/ext/pcre/tests/split2.phpt b/ext/pcre/tests/split2.phpt
index b0411e6df2..5c77c6d1bc 100644
--- a/ext/pcre/tests/split2.phpt
+++ b/ext/pcre/tests/split2.phpt
@@ -310,8 +310,5 @@ array(6) {
Warning: preg_last_error() expects exactly 0 parameters, 1 given in %s on line %d
NULL
bool(true)
-array(1) {
- [0]=>
- string(6) "ab2c3u"
-}
+bool(false)
bool(true)