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