From:             [EMAIL PROTECTED]
Operating system: linux
PHP version:      4.2.0
PHP Bug Type:     PCRE related
Bug description:  Segfaults in pcre with locale support

I was exeperinecing a lot of segfaults in apache error_log, but I was not
able to identify a simple script that could cause this error, since it
seemed to happen randomly in our programs (a script that works well only
sometimes causes the segfault).
>From the backtrace I found out the problem was inside pcre library:

#0  0x40215f38 in strcmp () from /lib/i686/libc.so.6
#1  0x404bf3ff in pcre_get_compiled_regex () from
/usr/lib/apache/libphp4.so
#2  0x404bfbe5 in php_pcre_match () from /usr/lib/apache/libphp4.so
#3  0x404bff8d in zif_preg_match_all () from /usr/lib/apache/libphp4.so
#4  0x4046cd8d in execute () from /usr/lib/apache/libphp4.so
#5  0x4047db98 in zend_execute_scripts () from /usr/lib/apache/libphp4.so
#6  0x4048ba56 in php_execute_script () from /usr/lib/apache/libphp4.so
#7  0x4048763a in apache_php_module_main () from
/usr/lib/apache/libphp4.so
#8  0x404881c3 in send_php () from /usr/lib/apache/libphp4.so
#9  0x40488223 in send_parsed_php () from /usr/lib/apache/libphp4.so
#10 0x080549fd in ap_invoke_handler ()
#11 0x0806732c in process_request_internal ()
#12 0x080673a3 in ap_process_request ()
#13 0x0805f7c7 in child_main ()
#14 0x0805fa09 in make_child ()
#15 0x0805faad in startup_children ()
#16 0x080600fd in standalone_main ()
#17 0x080609f3 in main ()
#18 0x401ac627 in __libc_start_main (main=0x8060570 <main>, argc=1,
ubp_av=0xbffff714, 
    init=0x804f328 <_init>, fini=0x8074e90 <_fini>, rtld_fini=0x4000dcc4
<_dl_fini>, stack_end=0xbffff70c)
    at ../sysdeps/generic/libc-start.c:129


Looking at the source code I found out a possible bug.
I include here a patch for the modifications I have made which seems to
have fixed the problem.

Regards,
Matteo Fago


--- pcre/php_pcre.c.orig        Fri Apr 26 14:03:31 2002
+++ pcre/php_pcre.c     Fri Apr 26 14:05:47 2002
@@ -64,6 +64,7 @@
        pefree(pce->re, 1);
 #if HAVE_SETLOCALE
        if ((void*)pce->tables) pefree((void*)pce->tables, 1);
+       if ((void*)pce->locale) pefree((void*)pce->locale, 1);
 #endif
 }
 
@@ -151,7 +152,7 @@
        regex_len = strlen(regex);
        if (zend_hash_find(&PCRE_G(pcre_cache), regex, regex_len+1, (void
**)&pce) == SUCCESS) {
 #if HAVE_SETLOCALE
-               if (!strcmp(pce->locale, locale)) {
+               if (locale!=NULL && pce->locale!=NULL &&
!strcmp(pce->locale, locale)) {
 #endif
                        *extra = pce->extra;
                        *preg_options = pce->preg_options;
@@ -298,7 +299,12 @@
        new_entry.extra = *extra;
        new_entry.preg_options = poptions;
 #if HAVE_SETLOCALE
-       new_entry.locale = locale;
+       if (locale!=NULL) {
+               new_entry.locale = php_pcre_malloc(strlen(locale)+1);
+               strcpy(new_entry.locale,locale);
+       } else {
+               new_entry.locale=locale;
+       }
        new_entry.tables = tables;
 #endif
        zend_hash_update(&PCRE_G(pcre_cache), regex, regex_len+1, (void
*)&new_entry,





-- 
Edit bug report at http://bugs.php.net/?id=16851&edit=1
-- 
Fixed in CVS:        http://bugs.php.net/fix.php?id=16851&r=fixedcvs
Fixed in release:    http://bugs.php.net/fix.php?id=16851&r=alreadyfixed
Need backtrace:      http://bugs.php.net/fix.php?id=16851&r=needtrace
Try newer version:   http://bugs.php.net/fix.php?id=16851&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=16851&r=support
Expected behavior:   http://bugs.php.net/fix.php?id=16851&r=notwrong
Not enough info:     http://bugs.php.net/fix.php?id=16851&r=notenoughinfo
Submitted twice:     http://bugs.php.net/fix.php?id=16851&r=submittedtwice

Reply via email to