]> granicus.if.org Git - php/commitdiff
Fix #72693: mb_ereg_search increments search position when a match zero-width
authorChristoph M. Becker <cmb@php.net>
Thu, 28 Jul 2016 11:56:40 +0000 (13:56 +0200)
committerChristoph M. Becker <cmb@php.net>
Thu, 28 Jul 2016 11:57:38 +0000 (13:57 +0200)
That's caused by an off-by-one error, which we fix.

NEWS
ext/mbstring/php_mbregex.c
ext/mbstring/tests/bug72691.phpt
ext/mbstring/tests/bug72693.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 962be025812d596ef28ac3e0d8cc25d8a6afd123..7a0e89086922287837d93b2f86959e60eae593f6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -44,6 +44,8 @@ PHP                                                                        NEWS
 - mbstring:
   . Fixed bug #72691 (mb_ereg_search raises a warning if a match zero-width).
     (cmb)
+  . Fixed Bug #72693 (mb_ereg_search increments search position when a match
+    zero-width). (cmb)
 
 - PCRE:
   . Fixed bug #72688 (preg_match missing group names in matches). (cmb)
index 3509165ca9ed5354eaa9f51b85d8c818d127f5f5..a295f54e4e570089be3513e4d31d799c30661e06 100644 (file)
@@ -1261,7 +1261,7 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode)
                        break;
                }
                end = MBREX(search_regs)->end[0];
-               if (pos < end) {
+               if (pos <= end) {
                        MBREX(search_pos) = end;
                } else {
                        MBREX(search_pos) = pos + 1;
index d914a508e059b73f355624c4a86c54e5b4707b6c..08f6b153da743e532d1a0161c087ddc2b0672675 100644 (file)
@@ -26,12 +26,12 @@ var_dump(mb_ereg_search_getpos());
 var_dump(mb_ereg_search_getregs());
 ?>
 --EXPECT--
-int(1)
+int(0)
 array(1) {
   [0]=>
   string(0) ""
 }
-int(2)
+int(0)
 array(1) {
   [0]=>
   string(0) ""
@@ -39,9 +39,9 @@ array(1) {
 int(3)
 array(1) {
   [0]=>
-  string(1) "o"
+  string(3) "foo"
 }
-int(4)
+int(3)
 array(1) {
   [0]=>
   string(0) ""
diff --git a/ext/mbstring/tests/bug72693.phpt b/ext/mbstring/tests/bug72693.phpt
new file mode 100644 (file)
index 0000000..f269e57
--- /dev/null
@@ -0,0 +1,41 @@
+--TEST--
+Bug #72693 (mb_ereg_search increments search position when a match zero-width)
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip ext/mbstring required');
+?>
+--FILE--
+<?php
+mb_ereg_search_init('foo');
+
+var_dump(mb_ereg_search('\A'));
+var_dump(mb_ereg_search_getpos());
+
+var_dump(mb_ereg_search('\s*'));
+var_dump(mb_ereg_search_getpos());
+
+var_dump(mb_ereg_search('\w+'));
+var_dump(mb_ereg_search_getpos());
+var_dump(mb_ereg_search_getregs());
+
+var_dump(mb_ereg_search('\s*'));
+var_dump(mb_ereg_search_getpos());
+
+var_dump(mb_ereg_search('\Z'));
+var_dump(mb_ereg_search_getpos());
+?>
+--EXPECT--
+bool(true)
+int(0)
+bool(true)
+int(0)
+bool(true)
+int(3)
+array(1) {
+  [0]=>
+  string(3) "foo"
+}
+bool(true)
+int(3)
+bool(true)
+int(3)