Bug #70699 [Opn]: Regex limits on repeating patterns

From: Date: Mon, 12 Oct 2015 22:11:52 +0000
Subject: Bug #70699 [Opn]: Regex limits on repeating patterns
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-196575@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=70699&edit=1

 ID:                 70699
 Updated by:         rasmus@php.net
 Reported by:        bugs dot php dot net at ss dot st dot tc
 Summary:            Regex limits on repeating patterns
 Status:             Open
 Type:               Bug
 Package:            *Regular Expressions
 Operating System:   OSX and Linux
 PHP Version:        7.0.0RC4
 Block user comment: N
 Private report:     N

 New Comment:

This is getting more into a PCRE question than a PHP one. See: http://www.pcre.org/original/doc/html/pcrejit.html
where it says:

  The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a 
  very large pattern tree goes on for too long, as it is in the same 
  circumstance when JIT is not used, but the details of exactly what is counted 
  are not the same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned 
  by JIT execution.


Previous Comments:
------------------------------------------------------------------------
[2015-10-12 22:01:17] bugs dot php dot net at ss dot st dot tc

You're right Rasmus, jit was the reason. So how do we control the limits with jit then?

------------------------------------------------------------------------
[2015-10-12 21:37:25] rasmus@php.net

The limits work a bit different with the jit enabled I think. I bet if you set pcre.jit=0 in PHP 7
you will get the same result.

------------------------------------------------------------------------
[2015-10-12 21:32:05] bugs dot php dot net at ss dot st dot tc

pcre.backtrack_limit is set to default value of 1000000 in both configurations.

------------------------------------------------------------------------
[2015-10-12 20:32:45] requinix@php.net

You're probably hitting the backtrack limit in PCRE. Compare the values of the
pcre.backtrack_limit setting on your two setups.

------------------------------------------------------------------------
[2015-10-12 19:25:29] bugs dot php dot net at ss dot st dot tc

Description:
------------
Following examples work well in PHP 5, but fail to produce correct results in PHP 7.

Test script:
---------------
<?php

echo preg_match('/((A)+)/', str_repeat('A', 1363)) ? 1 : 0, PHP_EOL;
echo preg_match('/((A)+)/', str_repeat('A', 1364)) ? 1 : 0, PHP_EOL;

echo preg_match('/((A)*)/', str_repeat('A', 1363)) ? 1 : 0, PHP_EOL;
echo preg_match('/((A)*)/', str_repeat('A', 1364)) ? 1 : 0, PHP_EOL;

echo preg_match_all('/((A)+)/', str_repeat('A', 1363)) ? 1 : 0, PHP_EOL;
echo preg_match_all('/((A)+)/', str_repeat('A', 1364)) ? 1 : 0, PHP_EOL;

echo preg_match_all('/((A)*)/', str_repeat('A', 1363)) ? 1 : 0, PHP_EOL;
echo preg_match_all('/((A)*)/', str_repeat('A', 1364)) ? 1 : 0, PHP_EOL;


Expected result:
----------------
Both PHP 5 and 7:
1
1
1
1
1
1
1
1


Actual result:
--------------
PHP 5:
1
1
1
1
1
1
1
1

PHP 7:
1
0
1
0
1
0
1
0



------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=70699&edit=1


Thread (11 messages)

« previous php.bugs (#196575) next »