ID: 47520 Comment by: phpwnd at gmail dot com Reported By: pahan at hubbitus dot spb dot su Status: Open Bug Type: PCRE related Operating System: Linux PHP Version: 5.3.0beta1 New Comment:
I'd like to add that you don't need such a complicated test case, you can make preg_* segfault with just something like: $str = str_repeat(' ', 2490); preg_match('#(.)+#', $str); On my computer, a 2490-chars string is long enough to make it segfaults everytime. For some reason, 2489 chars will make it segfault only 1 out of 5 runs and 2480 chars are perfectly fine. If I replace the regexp with more capturing parenthesis such as #((.))+# that limit drops to 1500-or-so and that number decreases as the number of parenthesis increases. Using non-capturing patterns such as #(?:.)+# doubles that number. Obviously, the bug is related to capturing patterns repetition, assuming we're experiencing the same bug. I'll try to find a place where to host a core dump. Previous Comments: ------------------------------------------------------------------------ [2009-02-28 09:00:02] pahan at hubbitus dot spb dot su Very apologize for mistake. I'm fix rights now, please recheck. ------------------------------------------------------------------------ [2009-02-28 01:19:21] fel...@php.net I cannot download the coredump file: "You don't have permission to access /_temp/php-pcre-bug/2/core.10135 on this server." Can you give us a backtrace? ------------------------------------------------------------------------ [2009-02-27 20:06:13] pahan at hubbitus dot spb dot su I'm thrice check the previous reports about this issue. And what? All closed as bogus, but segmentatoin fault still here! Where solution/fix??? Even common workaraund of problem is absent. Why it is bogus but not bug??? And also, please again read note: I use "Once-only subpattern", so, this should prevent recursion as I can understand. Or not? ------------------------------------------------------------------------ [2009-02-27 19:37:00] fel...@php.net Please, check the previous reports about this issue: http://bugs.php.net/search.php?search_for=&boolean=1&limit=10&order_by=id&direction=DESC&cmd=display&status=Bogus&bug_type%5B%5D=PCRE+related&php_os=&phpver=&assign=&author_email=&bug_age=0 http://docs.php.net/manual/en/pcre.configuration.php ------------------------------------------------------------------------ [2009-02-27 11:13:58] pahan at hubbitus dot spb dot su Description: ------------ PHP segfaulted when I try replace in long string by next regexp: '((?>(?:[^']|(?<=\\\)')*))' Some comments to reproduce code comments to case 1 and 2 is clearly. In case 3 and 4 I just run script several times, like (assume file named test.php): for (( i=100; i>0; i-- )) ; do echo -n $i: ; ./test.php ; done Sample results of its run you may see here: http://ru.bir.ru/_temp/php-pcre-bug/2/4965.log for 3 (files named by length of tested string), and for 4 - http://ru.bir.ru/_temp/php-pcre-bug/2/4967.log Coredump may be downloaded here: http://ru.bir.ru/_temp/php-pcre-bug/2/core.10135 Also, please note, I add construction (?> ... ) to speedup and dissallow recursion, so, it is must be different from bugs http://bugs.php.net/bug.php?id=27492 , http://bugs.php.net/bug.php?id=47376 , http://bugs.php.net/bug.php?id=47376 and http://bugs.php.net/bug.php?id=27310 . Reproduce code: --------------- <? $cont = "'" . str_pad('', 5000, '-');<->//1: Always "segmantation fault" //$cont = "'" . str_pad('', 4000, '-');>//2: "Never" (Is I can see in 1000 iterations) "segmantation fault" //$cont = "'" . str_pad('', 4965, '-');>//3: Segfaulted from times to times ~ 1-2 times from 100 executions //$cont = "'" . str_pad('', 4967, '-');>//4: Segfaulted 50/50% $reg = "#'((?>(?:[^']|(?<=\\\)')*))'#"; preg_replace($reg, '', $cont); echo "OK\n"; ?> Expected result: ---------------- OK Actual result: -------------- Segmentation fault ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=47520&edit=1