|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-02-27 11:13 UTC] 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 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Dec 01 23:00:02 2025 UTC |
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.