]> granicus.if.org Git - php/commitdiff
Fix #78853: preg_match() may return integer > 1
authorChristoph M. Becker <cmbecker69@gmx.de>
Fri, 22 Nov 2019 18:21:43 +0000 (19:21 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Fri, 22 Nov 2019 18:26:26 +0000 (19:26 +0100)
Commit 54ebebd[1] optimized the match loop, but for this case it has
been overlooked, that we must only loop if we're doing global matching.

[1] <http://git.php.net/?p=php-src.git;a=commit;h=54ebebd686255c5f124af718c966edb392782d4a>

NEWS
ext/pcre/php_pcre.c
ext/pcre/tests/bug78853.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index abedf9c09e2159bd6b371b1c86e1e5fd4f7a8d4a..53ad0a7a4d0a62af6e076660d698fdf878125201 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,9 @@ PHP                                                                        NEWS
   . Fixed $x = (bool)$x; with opcache (should emit undeclared variable notice).
     (Tyson Andre)
 
+- PCRE:
+  . Fixed bug #78853 (preg_match() may return integer > 1). (cmb)
+
 - Standard:
   . Fixed bug #78759 (array_search in $GLOBALS). (Nikita)
 
index 882389e1cef18134ccf040d4707a28ad07fa1108..38eabe2556d2db4766234ec8daa527a8095d1a0a 100644 (file)
@@ -1344,7 +1344,11 @@ matched:
                                count = pcre2_match(pce->re, (PCRE2_SPTR)subject, subject_len, start_offset2,
                                        PCRE2_NO_UTF_CHECK | PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED, match_data, mctx);
                                if (count >= 0) {
-                                       goto matched;
+                                       if (global) {
+                                               goto matched;
+                                       } else {
+                                               break;
+                                       }
                                } else if (count == PCRE2_ERROR_NOMATCH) {
                                        /* If we previously set PCRE2_NOTEMPTY_ATSTART after a null match,
                                           this is not necessarily the end. We need to advance
diff --git a/ext/pcre/tests/bug78853.phpt b/ext/pcre/tests/bug78853.phpt
new file mode 100644 (file)
index 0000000..369ed0f
--- /dev/null
@@ -0,0 +1,8 @@
+--TEST--
+Bug #78853 (preg_match() may return integer > 1)
+--FILE--
+<?php
+var_dump(preg_match('/^|\d{1,2}$/', "7"));
+?>
+--EXPECT--
+int(1)