#50264 [Bgs]: Possible pcre memory leak
| From: | rasmus@php.net | Date: | Fri, 27 Nov 2009 23:26:10 +0000 |
| Subject: | #50264 [Bgs]: Possible pcre memory leak | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-145149@lists.php.net to get a copy of this message | ||
ID: 50264
Updated by: rasmus@php.net
Reported By: laszlo dot janszky at gmail dot com
Status: Bogus
Bug Type: PCRE related
Operating System: Windows XP
PHP Version: 5.3.1
New Comment:
Did you test it with the command line pcre test tool? This is unlikely
to have anything to do with php-specific code.
Previous Comments:
------------------------------------------------------------------------
[2009-11-27 23:07:01] laszlo dot janszky at gmail dot com
OK.
If it's not a bug, then what is it?
------------------------------------------------------------------------
[2009-11-27 17:57:16] jani@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
------------------------------------------------------------------------
[2009-11-23 19:38:35] laszlo dot janszky at gmail dot com
If it is not clear, by the test:
the 8 tokens withBlock (M1) test string is:
$test='
{display}
{display}
{display}
{display}
{display}
{display}
{display}
{display}
{/display}
{/display}
{/display}
{/display}
{/display}
{/display}
{/display}
{/display}
';
and the 8 tokens withoutBlock (M2) test string is:
$test='
{display}
{display}
{display}
{display}
{display}
{display}
{display}
{display}
';
------------------------------------------------------------------------
[2009-11-23 19:21:02] laszlo dot janszky at gmail dot com
The leak is in relation with this
http://bugs.php.net/bug.php?id=49333
Here is a simplyfied example with eight "withoutBlock" tokens:
<?php
ini_set('pcre.backtrack_limit', 40000);
ini_set('pcre.recursion_limit', 1000);
$pattern=
'%
{(\w+)(?:}
(.*?(?:(?0).*?)*?)
{/\1)?}
%usDx';
$test='
{display}
{display}
{display}
{display}
{display}
{display}
{display}
{display}
';
preg_match_all($pattern,$test,$matches,PREG_SET_ORDER);
var_dump($matches);
?>
The basic syntax is:
{withBlock}block{/withBlock}
or
{withoutBlock}
As the {withBlock} opener part is of the same structure like the
{withoutBlock}, it starts to collect the string after the {withoutBlock}
to the backtrace. But for some kind of reason the {withoutBlock}
backtrace eats up the memory superexponential, not linear like in the
case of {withBlock}.
A measured the memory usage with the simplyfied example. It was not
superexponential, just exponential. I think cause I have in this example
two capturing groups only, not a lot like in the original code.
tokens M1[b] M2[b] LN(M2)
1 19 22 3,0910
2 53 115 4,7449
3 87 405 6,0039
4 121 1286 7,1593
5 155 3940 8,2789
6 189 11913 9,3854
7 223 35843 10,4869
8 257 107644 11,6204
M1 = 34 * N - 15
R^2 = 1
M2 = exp ( 1,1192 * N + 2,6669 )
R^2 = 0,9999 for the 3-8 part
Btw. it's funny memory usage.....................
------------------------------------------------------------------------
[2009-11-22 18:53:14] laszlo dot janszky at gmail dot com
If I remove the recursive part
(?:\\}(?<block>.*?(?:(?0).*?)*?)\\{/(?P=function))?
from the end of the regex, then it works fine...
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/50264
--
Edit this bug report at http://bugs.php.net/?id=50264&edit=1