PHP Bugs  
php.net | support | documentation | report a bug | advanced search | search howto | statistics | login

go to bug id or search bugs for  

Bug #45546 PCRE with utf8 kill apache childprocess
Submitted:17 Jul 2008 4:31pm UTC Modified: 26 Sep 2008 4:17pm UTC
From:kaiser at macbureau dot de Assigned to:
Status:No Feedback Category:PCRE related
Version:5.2.6 OS:FreeBSD 7
Votes:30 Avg. Score:4.8 ± 0.6 Reproduced:29 of 29 (100.0%)
Same Version:14 (48.3%) Same OS:23 (79.3%)
View/Vote Add Comment Developer Edit Submission

Have you experienced this issue?
Rate the importance of this bug to you:

[17 Jul 2008 4:31pm UTC] kaiser at macbureau dot de
Description:
------------
PCRE with utf8 (Typo3 Mailform) kills apache childprocess. With the 
following entry in apache errorlog on FreeBSD 7 with Apache 2.2.8:

[notice] child pid 6709 exit signal Illegal instruction (4)

Output of ulimit -a:

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) 33554432
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 11095
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 524288
cpu time               (seconds, -t) unlimited
max user processes              (-u) 5547
virtual memory          (kbytes, -v) unlimite

Reproduce code:
---------------
#!/usr/local/bin/php
<?php

function is_utf8($str) {
                return
(preg_match('/^([\x00-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\
}

$i=0;
$str = '';
while ($i<5000) {
    $str .= 'a';
    $i++;
}

is_utf8($str);

?>

[17 Jul 2008 5:53pm UTC] nlopess@php.net
the pasted code is incomplete (doesn't even run). Please provide a
complete, but short, reproducible script.
[17 Jul 2008 7:29pm UTC] kaiser at macbureau dot de
Sorry, c&p error, thanks, looking forward to hear from you.

./test.php
Segmentation fault (core dumped)

#!/usr/local/bin/php
<?php

function is_utf8($str) {
		return (preg_match('/^([\x00-\x7f]|[\xc2-\xdf][\x80-
\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xec][\x80-\xbf]{2}|\xed[\x80-
\x9f][\x80-
\xbf]|[\xee-\xef][\x80-\xbf]{2}|f0[\x90-\xbf][\x80-\xbf]{2}|[\xf1-
\xf3][\x80-
\xbf]{3}|\xf4[\x80-\x8f][\x80-\xbf]{2})*$/', $str) === 1);
}

$i=0;
$str = '';
while ($i<5000) {
    $str .= 'a';
    $i++;
}

is_utf8($str);

?>
[19 Jul 2008 11:13am UTC] nlopess@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows (zip):
 
  http://snaps.php.net/win32/php5.3-win32-latest.zip

For Windows (installer):

  http://snaps.php.net/win32/php5.3-win32-installer-latest.msi

I can't reproduce the crash here, nor valgrind finds any problem. Can
you please try the cvs version please?
[19 Jul 2008 12:19pm UTC] felipe@php.net
I can reproduce. (PHP 5.2.7-dev)

==6244== Stack overflow in thread 1: can't grow stack to 0xBE04DFC0
==6244== 
==6244== Process terminating with default action of signal 11 (SIGSEGV)
==6244==  Access not within mapped region at address 0xBE04DFC0
==6244==    at 0x8099F78: match (pcre_exec.c:1287)
==6244== Stack overflow in thread 1: can't grow stack to 0xBE04DF9C
==6244== 
==6244== Process terminating with default action of signal 11 (SIGSEGV)
==6244==  Access not within mapped region at address 0xBE04DF9C
==6244==    at 0x401D200: _vgnU_freeres (vg_preloaded.c:56)
[22 Jul 2008 11:08pm UTC] nikolas dot hagelstein at gmail dot com
Confirmed. 

System:
FreeBSD 7
PHP 5.2.6 (PCRE Library Version => 7.6 2008-01-28)
stack size              (kbytes, -s) 524288

Backtrace:

#6216 0x000000080407a494 in match () from
/usr/local/lib/php/20060613/pcre.so
#
#6217 0x000000080407701c in match () from
/usr/local/lib/php/20060613/pcre.so
#
#6218 0x000000080407a494 in match () from
/usr/local/lib/php/20060613/pcre.so
#
#6219 0x000000080407701c in match () from
/usr/local/lib/php/20060613/pcre.so
#
#6220 0x0000000804076d05 in match () from
/usr/local/lib/php/20060613/pcre.so
#
#6221 0x000000080407f12f in php_pcre_exec ()
#
   from /usr/local/lib/php/20060613/pcre.so
#
 
#
#6222 0x0000000804084c02 in php_pcre_match_impl ()
#
   from /usr/local/lib/php/20060613/pcre.so
#
#6223 0x000000080408569b in php_do_pcre_match ()
#
   from /usr/local/lib/php/20060613/pcre.so
#
#6224 0x0000000000538912 in zend_do_fcall_common_helper_SPEC ()
#
#6225 0x0000000000528603 in execute ()
#
#6226 0x00000000005383a4 in zend_do_fcall_common_helper_SPEC ()
#
#6227 0x0000000000528603 in execute ()
#
#6228 0x0000000000508dd3 in zend_execute_scripts ()
#
#6229 0x00000000004c5a5d in php_execute_script ()
[25 Jul 2008 1:45pm UTC] hempalex at gmail dot com
I reproduced this on FreeBSD 7.0 + Apache/2.2.9 + PHP/5.2.6 (bundled
prce)

script:

<?php 

$str = str_repeat('a', 10000);
    $utf8 =
(preg_match("/^([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0
-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80
-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80
-\x8F][\x80-\xBF]{2})*$/", $str)) ? "yes" : "no"; 
	echo $utf8;

?>
mod_php: 
   in apache logs: [notice] child pid 54586 exit signal Illegal
instruction (4)

in cli works fine!
[27 Jul 2008 1:00am UTC] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
[26 Sep 2008 9:17am UTC] ale at FreeBSD dot org
The feedback was provided.

In any case the above script works if the string length is <= 2243 and
stops working if > 2243 'a' chars.
[26 Sep 2008 4:17pm UTC] nlopess@php.net
again I cannot reproduce this problem. Try to adjust
pcre.backtrack_limit and pcre.recursion_limit to some sane values.
[14 Jan 2009 12:27pm UTC] jdc at parodius dot com
This bug still exists in PHP 5.2.8, which uses its own bundled version
of pcre.  FreeBSD 7.1-STABLE is being used here.

I have a customer who is experiencing this problem on a near-daily basis
(logs showing httpd SIGILL regularly).

I can induce a signal 11 from the shell (using PHP CLI) executing the
code provided by "hempalex at gmail dot com" as well as the code
provided by "kaiser at macbureau dot de".  The comment from "ale at
FreeBSD.org" also applies -- the value given to str_repeat() does in
fact play a role.

But when run from within Apache (2.2.11 using mod_php), signal 4
(illegal instruction) happens.  I'm not sure why from within Apache it's
SIGILL but from the command-line it's SIGSEGV.

Increasing pcre.backtrack_limit and pcre.recursion_limit does not help. 
Decreasing them also does not help.

I'd like to urge the PHP folks to take this problem seriously.  There
are many of us using FreeBSD who would be more than happy to give you an
account on a development/test system for you to work out the source of
this problem.
[14 Jan 2009 1:00pm UTC] jdc at parodius dot com
I've built PHP 5.2.8 with debugging enabled, and ran the following
script under PHP via the CLI, under gdb:

<?php
$str = str_repeat('a', 1244);
$utf8 =
(preg_match("/^([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0
-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|
\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x8
0-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/", $str)) ? "yes
" : "no";
echo $utf8;
?>

It's important to note that if I change the str_repeat() length from
1244 to 1243, the segfault doesn't happen.  The system limits:

Resource limits (current):
  cputime          infinity secs
  filesize         infinity kB
  datasize           786432 kB
  stacksize          131072 kB
  coredumpsize     infinity kB
  memoryuse        infinity kB
  memorylocked     infinity kB
  maxprocesses         5547
  openfiles           11095
  sbsize           infinity bytes
  vmemoryuse       infinity kB

Anyway, the results of the gdb backtrace are here (~790KB file):

http://www.malkavian.com/~jdc/php.bug45546.backtrace.txt

Hope this helps.
[27 Jan 2009 2:16am UTC] jdw at wheelhouse dot org
We are also having this problem on FreeBSD 7 with Apache 1.3.  The 
stack trace is the same:

#0  0x286dcbc7 in match () from /usr/local/lib/libpcre.so.0
#1  0x286e3aba in match () from /usr/local/lib/libpcre.so.0
#2  0x286e3aba in match () from /usr/local/lib/libpcre.so.0
#3  0x286e469e in match () from /usr/local/lib/libpcre.so.0
#4  0x286dd629 in match () from /usr/local/lib/libpcre.so.0
#5  0x286e76c4 in pcre_exec () from /usr/local/lib/libpcre.so.0
#6  0x284b72fe in php_pcre_match_impl ()
   from /nfsn/apps/apache/libexec/libphp5.so
#7  0x284b7cac in php_do_pcre_match ()
   from /nfsn/apps/apache/libexec/libphp5.so
#8  0x285db1a8 in zend_do_fcall_common_helper_SPEC ()
   from /nfsn/apps/apache/libexec/libphp5.so
#9  0x285cca7f in execute () from /nfsn/apps/apache/libexec/libphp5.so
#10 0x28b2f0c2 in _su3jdmx ()
   from /nfsn/apps/php5/lib/php/extensions/no-debug-non-zts-
20060613/ioncube_loader_fre_5.2.so
#11 0x2af863d8 in ?? ()
#12 0x29e80750 in ?? ()
#13 0x29e7f75c in ?? ()
#14 0x285dac0e in zend_do_fcall_common_helper_SPEC ()
   from /nfsn/apps/apache/libexec/libphp5.so

(This version was built with the FreeBSD PCRE instead of the builtin 
in case that helped; it didn't.)

In one case, a customer has to set pcre.backtrack_limit and 
pcre.recursion_limit to 10 to get a Wordpress RSS feed to load.

Are those considered "sane" values?  

Or is this getting ignored due to the incorrect "No Feedback" status?
[27 Jan 2009 12:37pm UTC] keltia at gmail dot com
I have a similar problem after upgrading to PHP 5.2.8/PCRE 7.8 on a
FreeBSD 7.1/amd64. I'm trying to upgrade Gallery2 to 2.3 and the
installer fails with that error.
[Tue Jan 27 12:28:12 2009] [notice] child pid 92633 exit signal Illegal
instruction (4)
[5 Feb 2009 1:43am UTC] vanav at vanav dot com dot ua
Got the same bug, PHP 5.2.8/PCRE 7.8, Apache 2.2.11, Freebsd.
[8 Feb 2009 11:55am UTC] vanav at vanav dot com dot ua
Two gdb examples:

gdb66: Program received signal SIGSEGV, Segmentation fault.
match (
    eptr=0x29385a68 "3'\";\n$select[] = \"SELECT p1.id, nick,
p1.creation_date, p1.modification_date, p1.post_title, p1.post_text,
p1.parent_post_id, p2.post_title AS parent_post_title, p3.post_title AS
answer_parent_post_ti"..., ecode=0x28f160ed "\034\"T", 
    mstart=0x293854bc "<?php\n$select = array();\n$select[] = \"SELECT
uni_files.id, name, disk_filename, icon, size FROM uni_files INNER JOIN
uni_filetypes ON uni_files.filetype_id=uni_filetypes.id WHERE
post_id='167' AND blo"..., offset_top=4, md=0xbfbef000, ims=6,
eptrb=0x0, flags=0, 
    rdepth=1362) at
/usr/ports/lang/php5/work/php-5.2.8/ext/pcre/pcrelib/pcre_exec.c:580
580	prop_value = 0;

and

0x2863b28a in match (
    eptr=0x2940b64f "?&#1072;&#1052;202&#1052;214,
&#1076;&#1072;&#1078;&#1077;
&#1052;201&#1052;200&#1077;&#1076;&#1085;&#1077;&#1084;&#1052;203
&#1082;&#1083;&#1072;&#1052;201&#1052;201&#1052;203>, ?00\223
&#1079;&#1072;&#1052;217&#1074;&#1080;&#1083;
?232&#1052;203&#1085;&#1080;&#1052;206&#1052;213&#1085;.  
&#1076;&#1072;&#1078;&#1077;
&#1052;201&#1052;200&#1077;&#1076;&#1085;&#1077;&#1084;&#1052;203
&#1082;&#1083;&#1072;&#1052;201&#1052;201&#1052;203>, ?00\223
&#1079;&#1072;&#1052;217&#1074;&#1080;&#1083;
?232&#1052;203&#1085;&#1080;&#1052;206&#1052;213&#1085;. 
</p><p><?222&#1052;213 &#1079;&#1085;&#1072;&#1077;&#1052;202&#1077;,
&#1052;207&#1052;202&#1086; ?..., ecode=0x28ef03bb "\034'U", 
    mstart=0x2940b398 "'<p>?237&#1086;
&#1084;&#1085;&#1077;&#1085;&#1080;&#1052;216
?232&#1052;203&#1085;&#1080;&#1052;206&#1052;213&#1085;&#1072;,
&#1082;&#1052;200&#1052;213&#1084;&#1052;201&#1082;&#1080;&#1077;
&#1074;&#1083;&#1072;&#1052;201&#1052;202&#1080;
&#1076;&#1086;&#1083;&#1078;&#1085;&#1052;213
&#1076;&#1072;&#1052;202&#1052;214
&#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1052;201&#1052
;202&#1052;214
&#1052;201&#1052;200&#1077;&#1076;&#1085;&#1077;&#1084;&#1052;203
&#1082;&#1083;&#1072;&#1052;201&#1052;201&#1052;203
&#1082;&#1072;&#1087;&#1080;&#1052;202&#1072;&#1083;&#1080;&#1079;&#1080
;&#1052;200&#1086;&#1074;&#1072;&#1052;202&#1052;214 &#1080;&#1052;205
&#1052;201&#1073;&#1077;&#1052;200&#1077;&#1078;&#1077;&#1085;?...,
offset_top=4, md=0xbfbf89d0, ims=0, eptrb=0xbfa006a0, flags=2,
rdepth=1388)
    at
/usr/ports/lang/php5/work/php-5.2.8/ext/pcre/pcrelib/pcre_exec.c:2160
2160	/usr/ports/lang/php5/work/php-5.2.8/ext/pcre/pcrelib/pcre_exec.c:
No such file or directory.
	in /usr/ports/lang/php5/work/php-5.2.8/ext/pcre/pcrelib/pcre_exec.c
[26 Feb 2009 1:30am UTC] joe at lastpass dot com
Happens at somewhere between 3500 and 6400 characters on every Linux
platform I have access to (x86 and x86_64): 

PHP 5.2.6-3ubuntu2 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb 13 2009
20:07:08)

PHP 5.2.6-2ubuntu4.1 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb 11
2009 20:44:58) 

PHP 5.2.4-2ubuntu5.5 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb 11
2009 20:09:11) 

PHP 5.2.6-3ubuntu2 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb 13 2009
20:20:01)
[10 Jun 2009 6:06pm UTC] bob at veznat dot com
This is still broken. FreeBSD 7.1 and PHP 5.2.9. It seems that the 
original bug filer has provided plenty of repro. If that is not the case

I'd be happy to go through the process of digging up all I can from my 
machine.
[18 Sep 2009 7:57pm UTC] chris at smartt dot com
Still happening on FreeBSD 7.2 and PHP 5.2.9 with Suhosin-Patch 0.9.7
(cli) (built: May 11 2009 22:23:18)

#1860 0x28cdcad1 in match () from /usr/local/lib/libpcre.so.0
#1861 0x28cde851 in match () from /usr/local/lib/libpcre.so.0
#1862 0x28ce6ad7 in pcre_exec () from /usr/local/lib/libpcre.so.0
#1863 0x28cc931b in php_pcre_match_impl () from
/usr/local/lib/php/20060613/pcre.so
#1864 0x28cc9de0 in php_do_pcre_match () from
/usr/local/lib/php/20060613/pcre.so
#1865 0x0815c7bd in execute_internal ()
#1866 0x285d16e0 in suhosin_execute_internal () from
/usr/local/lib/php/20060613/suhosin.so
#1867 0x081695db in zend_do_fcall_common_helper_SPEC ()
#1868 0x0815d961 in execute ()
#1869 0x287810c2 in _su3jdmx () from
/usr/local/lib/php/20060613/ioncube_loader_fre_5.2.so
#1870 0x2912ef9c in ?? ()
#1871 0x00000000 in ?? ()
#1872 0x285dc780 in __JCR_LIST__ () from
/usr/local/lib/php/20060613/suhosin.so
#1873 0x285d1c55 in suhosin_execute_ex () from
/usr/local/lib/php/20060613/suhosin.so

RSS feed | show source 

PHP Copyright © 2001-2009 The PHP Group
All rights reserved.
Last updated: Sat Nov 21 10:30:49 2009 UTC