ID:               50264
 User updated by:  laszlo dot janszky at gmail dot com
 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:

Ahm, so you mean, this is a pcre memory handling problem, not a php
bug? Okay, then where can I report this issue?

(Sorry for the bad English, I'm just med- ...)


Previous Comments:
------------------------------------------------------------------------

[2009-11-27 23:26:10] ras...@php.net

Did you test it with the command line pcre test tool?  This is unlikely

to have anything to do with php-specific code.

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

[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] j...@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.....................

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

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

Reply via email to