Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Feb 2007 20:51:36 -0600
From:      Terry Todd <tlt@badger.tltodd.com>
To:        freebsd-questions@freebsd.org
Subject:   Re: phpMyAdmin httpd segmentation fault
Message-ID:  <20070209205136.A37561@badger.tltodd.com>
In-Reply-To: <20070206084230.A31659@badger.tltodd.com>; from tlt@badger.tltodd.com on Tue, Feb 06, 2007 at 08:42:30AM -0600
References:  <20070203204156.A4743@badger.tltodd.com> <45C5A93A.8010501@infracaninophile.co.uk> <20070205055425.A68136@badger.tltodd.com> <45C7482D.2060103@u.washington.edu> <20070205231230.A9862@badger.tltodd.com> <45C82ABA.1010606@infracaninophile.co.uk> <20070206055549.A24465@badger.tltodd.com> <20070206084230.A31659@badger.tltodd.com>

next in thread | previous in thread | raw e-mail | index | archive | help



I started from scratch and built a completely new system by installing
from CD's on a different computer and it does the exact same thing
in the exact same place.  At this point I'm a little surprised that
no one else has run across this.

Terry Todd


On Tue, Feb 06, 2007 at 08:42:30AM -0600, Terry Todd wrote:
> On Tue, Feb 06, 2007 at 07:14:02AM +0000, Matthew Seaman wrote:
> > Terry Todd wrote:
> > > On Mon, Feb 05, 2007 at 07:07:25AM -0800, Garrett Cooper wrote:
> > >> Terry Todd wrote:
> > >>> On Sun, Feb 04, 2007 at 09:36:58AM +0000, Matthew Seaman wrote:
> > >>>> Terry Todd wrote:
> > >>>>> I installed FreeBSD 6.2-RELEASE, php-5.1.6_3, php5-extensions-1.0,
> > >>>>> mysql-5.0.27 and apache_1.3.37_1.
> > >>>>>
> > >>>>> php -i now works Ok after I moved recode.so to the top of the list
> > >>>>> of extensions in extensions.ini.  It took a while to figure that
> > >>>>> one out.  Before that php -i would seg fault and core dump.  It
> > >>>>> took some google searching and using gdb on the core file to fix
> > >>>>> it.
> > >>>>>
> > >>>>> A test web page for phpinfo works fine too.  Mysql works OK from
> > >>>>> the command line.
> > >>>>>
> > >>>>> However I can't get phpMyAdmin to work.  It seg faults in reading 
> > >>>>> /usr/local/www/phpMyAdmin/libraries/url_generating.lib.php
> > >>>>> There is no core dump produced.
> > >>>> Hmmm... very strange.  We have just built a RELENG_6_2 server with
> > >>>> apache13-ssl, php5 and phpMyAdmin and no such problems are apparent.
> > >>>>
> > >>>> Did you modify the CFLAGS or otherwise change the level of
> > >>>> optimization used by the compiler?
> > >>> No CFLAGS were changed or anything else.  It's a very standard install.
> > >>>
> > >>>>> I ran ktrace httpd -X
> > >>>>>
> > >>>>> Then when I try to open the phpMyAdmin/index.php page in a browser
> > >>>>> httpd seg faults.
> > >>>>>
> > >>>>> Here is the tail of kdump from the ktrace.out from the above ktrace.
> > >>>>>
> > >>>>> ....
> > >>>>>   1372 httpd    CALL  gettimeofday(0xbfbf7158,0)
> > >>>>>   1372 httpd    RET   gettimeofday 0
> > >>>>>   1372 httpd    CALL  lstat(0xbfbf75b0,0xbfbf70f0)
> > >>>>>   1372 httpd    NAMI  "/usr"
> > >>>>>   1372 httpd    RET   lstat 0
> > >>>>>   1372 httpd    CALL  lstat(0xbfbf75b0,0xbfbf70f0)
> > >>>>>   1372 httpd    NAMI  "/usr/local"
> > >>>>>   1372 httpd    RET   lstat 0
> > >>>>>   1372 httpd    CALL  lstat(0xbfbf75b0,0xbfbf70f0)
> > >>>>>   1372 httpd    NAMI  "/usr/local/www"
> > >>>>>   1372 httpd    RET   lstat 0
> > >>>>>   1372 httpd    CALL  lstat(0xbfbf75b0,0xbfbf70f0)
> > >>>>>   1372 httpd    NAMI  "/usr/local/www/phpMyAdmin"
> > >>>>>   1372 httpd    RET   lstat 0
> > >>>>>   1372 httpd    CALL  lstat(0xbfbf75b0,0xbfbf70f0)
> > >>>>>   1372 httpd    NAMI  "/usr/local/www/phpMyAdmin/libraries"
> > >>>>>   1372 httpd    RET   lstat 0
> > >>>>>   1372 httpd    CALL  lstat(0xbfbf75b0,0xbfbf70f0)
> > >>>>>   1372 httpd    NAMI  "/usr/local/www/phpMyAdmin/libraries/url_generating.lib.php"
> > >>>>>   1372 httpd    RET   lstat 0
> > >>>>>   1372 httpd    CALL  open(0x845eda8,0,0x1b6)
> > >>>>>   1372 httpd    NAMI  "/usr/local/www/phpMyAdmin/libraries/url_generating.lib.php"
> > >>>>>   1372 httpd    RET   open 4
> > >>>>>   1372 httpd    CALL  fstat(0x4,0x8102748)
> > >>>>>   1372 httpd    RET   fstat 0
> > >>>>>   1372 httpd    CALL  lseek(0x4,0,0,0,0x1)
> > >>>>>   1372 httpd    RET   lseek 0
> > >>>>>   1372 httpd    CALL  read(0x4,0x82e3028,0x2000)
> > >>>>>   1372 httpd    GIO   fd 4 read 4096 bytes
> > >>>>>        "<?php
> > >>>>>         /* $Id: url_generating.lib.php,v 2.12.2.1 2006/09/26 19:23:24 lem9 Exp $ */
> > >>>>>         // vim: expandtab sw=4 ts=4 sts=4:
> > >>>>>
> > >>>>>
> > >>>>>         /**
> > >>>>>          * URL/hidden inputs generating.
> > >>>>>          */
> > >>>>>
> > >>>>>
> > >>>>>         /**
> > >>>>>          * Generates text with hidden inputs.
> > >>>>>          *
> > >>>>>          * @see     PMA_generate_common_url()
> > >>>>>          * @param   string   optional database name
> > >>>>>          * @param   string   optional table name
> > >>>>>          * @param   int      indenting level
> > >>>>>          *
> > >>>>>          * @return  string   string with input fields
> > >>>>>          *
> > >>>>>          * @global  string   the current language
> > >>>>>          * @global  string   the current conversion charset
> > >>>>>          * @global  string   the current connection collation
> > >>>>>          * @global  string   the current server
> > >>>>>          * @global  array    the configuration array
> > >>>>>          * @global  boolean  whether recoding is allowed or not
> > >>>>>          *
> > >>>>>          *
> > >>>>>          * @access  public
> > >>>>>          *
> > >>>>>          * @author  nijel
> > >>>>>          */
> > >>>>>         function PMA_generate_common_hidden_inputs($db = '', $table = '', $indent = 0, $skip = array())
> > >>>>>         {
> > >>>>>             if (is_array($db)) {
> > >>>>>                 $params  =& $db;
> > >>>>>                 $_indent = empty($table) ? $indent : $table;
> > >>>>>                 $_skip   = empty($indent) ? $skip : $indent;
> > >>>>>                 $indent  =& $_indent;
> > >>>>>                 $skip    =& $_skip;
> > >>>>>             } else {
> > >>>>>                 $params = array();
> > >>>>>                 if (isset($db) && strlen($db)) {
> > >>>>>                     $params['db'] = $db;
> > >>>>>                 }
> > >>>>>                 if (isset($table) && strlen($table)) {
> > >>>>>                     $params['table'] = $table;
> > >>>>>                 }
> > >>>>>             }
> > >>>>>
> > >>>>>             if (! empty($GLOBALS['server'])
> > >>>>>             &&  $GLOBALS['server'] != $GLOBALS['cfg']['ServerDefault']) {
> > >>>>>                 $params['server'] = $GLOBALS['server'];
> > >>>>>             }
> > >>>>>             if (empty($_COOKIE['pma_lang'])
> > >>>>>             && ! empty($GLOBALS['lang'])) {
> > >>>>>                 $params['lang'] = $GLOBALS['lang'];
> > >>>>>             }
> > >>>>>             if (empty($_COOKIE['pma_charset'])
> > >>>>>             && ! empty($GLOBALS['convcharset'])) {
> > >>>>>                 $params['convcharset'] = $GLOBALS['convcharset'];
> > >>>>>             }
> > >>>>>             if (empty($_COOKIE['pma_collation_connection'])
> > >>>>>             && ! empty($GLOBALS['collation_connection'])) {
> > >>>>>                 $params['collation_connection'] = $GLOBALS['collation_connection'];
> > >>>>>             }
> > >>>>>
> > >>>>>             $params['token'] = $_SESSION[' PMA_token '];
> > >>>>>
> > >>>>>             if (! is_array($skip)) {
> > >>>>>                 if (isset($params[$skip])) {
> > >>>>>                     unset($params[$skip]);
> > >>>>>                 }
> > >>>>>             } else {
> > >>>>>                 foreach ($skip as $skipping) {
> > >>>>>                     if (isset($params[$skipping])) {
> > >>>>>                         unset($params[$skipping]);
> > >>>>>                     }
> > >>>>>                 }
> > >>>>>             }
> > >>>>>
> > >>>>>             $spaces = str_repeat('    ', $indent);
> > >>>>>
> > >>>>>             $return = '';
> > >>>>>             foreach ($params as $key => $val) {
> > >>>>>                 $return .= $spaces . '<input type="hidden" name="' . htmlspecialchars($key) . '" value="' . htmlspecialchars(\
> > >>>>>         $val) . '" />' . "\\n";
> > >>>>>             }
> > >>>>>
> > >>>>>             return $return;
> > >>>>>         }
> > >>>>>
> > >>>>>         /**
> > >>>>>          * Generates text with URL parameters.
> > >>>>>          *
> > >>>>>          * <code>
> > >>>>>          * // note the ?
> > >>>>>          * echo 'script.php?' . PMA_generate_common_url('mysql', 'rights');
> > >>>>>          * // produces with cookies enabled:
> > >>>>>          * // script.php?db=mysql&amp;table=rights
> > >>>>>          * // with cookies disabled:
> > >>>>>          * // script.php?server=1&amp;lang=en-utf-8&amp;db=mysql&amp;table=rights
> > >>>>>          *
> > >>>>>          * $params['myparam'] = 'myvalue';
> > >>>>>          * $params['db']      = 'mysql';
> > >>>>>          * $params['table']   = 'rights';
> > >>>>>          * // note the missing ?
> > >>>>>          * echo 'script.php' . PMA_generate_common_url($params);
> > >>>>>          * // produces with cookies enabled:
> > >>>>>          * // script.php?myparam=myvalue&amp;db=mysql&amp;table=rights
> > >>>>>          * // with cookies disabled:
> > >>>>>          * // script.php?server=1&amp;lang=en-utf-8&amp;myparam=myvalue&amp;db=mysql&amp;table=rights
> > >>>>>          *
> > >>>>>          * // note the missing ?
> > >>>>>          * echo 'script.php' . PMA_generate_common_url();
> > >>>>>          * // produces with cookies enabled:
> > >>>>>          * // script.php
> > >>>>>          * // with cookies disabled:
> > >>>>>          * // script.php?server=1&amp;lang=en-utf-8
> > >>>>>          * </code>
> > >>>>>          *
> > >>>>>          * @param   mixed    assoc. array with url params or optional string with database name
> > >>>>>          *                   if first param is an array there is also an ? prefixed to the url
> > >>>>>          * @param   string   optional table name only if first param is array
> > >>>>>          * @param   string   character to use instead of '&amp;' for deviding
> > >>>>>          *                   multiple URL parameters from each other
> > >>>>>          *
> > >>>>>          * @return  string   string with URL parameters
> > >>>>>          *
> > >>>>>          * @global  string   the current language
> > >>>>>          * @global  string   the current conversion charset
> > >>>>>          * @global  string   the current connection collation
> > >>>>>          * @global  string   the current server
> > >>>>>          * @global  arra"
> > >>>>>   1372 httpd    RET   read 6467/0x1943
> > >>>>>   1372 httpd    CALL  read(0x4,0x82e3028,0x2000)
> > >>>>>   1372 httpd    GIO   fd 4 read 0 bytes
> > >>>>>        ""
> > >>>>>   1372 httpd    RET   read 0
> > >>>>>   1372 httpd    CALL  read(0x4,0x82e3028,0x2000)
> > >>>>>   1372 httpd    GIO   fd 4 read 0 bytes
> > >>>>>        ""
> > >>>>>   1372 httpd    RET   read 0
> > >>>>>   1372 httpd    CALL  close(0x4)
> > >>>>>   1372 httpd    RET   close 0
> > >>>>>   1372 httpd    PSIG  SIGSEGV SIG_DFL
> > >>>>>
> > >>>>>
> > >>>>> I moved url_generating.lib.php to url_generating.lib.php.sav and
> > >>>>> copied url_generating.lib.php.sav to a new url_generating.lib.php.
> > >>>>> Same thing happens.
> > >>>>>
> > >>>>> I tried the latest phpMyAdmin-2.9.2 and it does the exact same thing.
> > >>>>>
> > >>>>> It always seg faults in the exact same place in the exact same way.
> > >>>>>
> > >>>>> /var/log/messages file gets:
> > >>>>> Feb  3 16:07:38 testbox kernel: pid 8512 (httpd), uid 80: exited on signal 11
> > >>>> Hmmm... a SEGV in apache or one of it's loaded modules should result
> > >>>> in a core file in the cwd of the apache process. The general way to
> > >>>> switch that behaviour off is by using the limits(1) command to set
> > >>>> coredumpsize=0 -- and you can use /etc/login.conf to set limits for
> > >>>> a whole class of users.  If the apache startup scripts
> > >>>> are running eg:
> > >>>>
> > >>>>     eval `limits -e -C daemon`
> > >>>>
> > >>>> or similar that might be the cause.  However, the default settings
> > >>>> are 'coredumpsize=unlimited' for all, and I guess you'ld know if you'ld
> > >>>> changed any of that sort of thing.
> > >>>>
> > >>>> Hmmm... cwd for the Apache process is set to the root directory, like
> > >>>> all good daemons should.  You can see that by:
> > >>>>
> > >>>>    fstat -p `cat /var/run/httpd.pid`
> > >>>>
> > >>>> For very obvious security reasons, the root directory should not
> > >>>> be writable by daemon processes with network listeners (and conversely,
> > >>>> daemons should never be run as root or any other UID with write access,
> > >>>> well, anywhere much).  In this case, however, and strictly for testing
> > >>>> purposes, so long as it's on a machine not accessible from the Internet,
> > >>>> temporarily making the root dir writable by the apache process could help
> > >>>> get you a core file to analyse.
> > >>> I changed / to mode 777 and reran the test.  Same seg fault and still no core file.
> > >>> When I say there is no core file I have checked with find / -name "*.core"
> > >>> and there are no core files anywhere on the system.
> > >>>
> > >>>
> > >>>>> /var/log/httpd-errors gets:
> > >>>>> [Sat Feb  3 16:07:39 2007] [notice] child pid 8512 exit signal Segmentation fault (11)
> > >>>>>
> > >>>>> I am out of ideas on what to try next.  Anyone else have any suggestions?
> > >>>> Can you try unmounting and fsck'ing the partition (fsck -f /dev/adXsYz)
> > >>>> where url_generating.lib.php lives?
> > >>> I thought by creating a new url_generating.lib.php file that would test the problem
> > >>> of there being a bad spot on the disk.  fsck runs clean.
> > >>>
> > >>>> Given that the error you are seeing is so repeatable, it is unlikely
> > >>>> to be a hardware fault, but it may be worth running a cycle or two
> > >>>> of memtest86 to see if it picks up anything.
> > >>>>
> > >>>> Otherwise the only thing I can think to try is the rather blunt approach
> > >>>> of recompiling/reinstalling the phpMyAdmin port and everything it depends
> > >>>> on:
> > >>>>
> > >>>>     portupgrade -Rfi phpMyAdmin
> > >>>
> > >>> I ran portupgrade -Rfv phpMyAdmin.  It has a lot of dependencies
> > >>> so it took a long time to finish and I didn't want to sit in front
> > >>> of it and answer yes to all the questions.
> > >>>
> > >>>
> > >>> It still does the exact same thing.
> > >>>
> > >>> I'm stumped.  I guess I'll try a new install on a different system.
> > >>>
> > >>> Thanks,
> > >>> Terry Todd
> > >> It's a memory access issue most likely (signal 11), so making sure that 
> > >> all of its dependencies are current would be the first order of 
> > >> business. Don't forget to restart the http daemon that's using php so it 
> > >> can reload the libraries / dependencies.
> > >>
> > >> Next I'd check for memory errors on your machine; memtest86+ can solve that.
> > >>
> > >> Finally, (if possible) I'd see if you could trace down the exact line of 
> > >> code where it segfaulted (if it's a consistent location where it fails) 
> > >> in the phpMyAdmin program and then send it upstream to the maintainer 
> > >> via a bug report.
> > 
> > I am the maintainer for the phpMyAdmin port.  Consider me already informed.
> > 
> > > I took the hard drive out of the computer that was having the
> > > problem and installed in a completely different computer.
> > > 
> > > It still has the same exact problem in the same exact place.
> > > 
> > > The only reference to url_generating.lib.php is on line 2682 of
> > > phpMyAdmin/libraries/common.lib.php
> > > 
> > > httpd is what actually segfaults when reading the file url_generating.lib.php.
> > 
> > Given that I've seen no other reports of anything like this, either
> > direct to me or to phpMyAdmin lists on sourceforge, and that I've
> > got a number of phpMyAdmin installations happily working for various
> > customers using various different Apache and PHP versions, I'm pretty
> > certain that the root cause of your problem is something localised on
> > your system.
> > 
> > I think you've pretty well eliminated hardware faults (either memory
> > or disk) as the cause.  Therefore the prime suspect must be something
> > within your local install.  Two possibilities come to mind: (a) does
> > your php installation contain all of the required functionality? (b)
> > have you managed to place some sort of pathological statement in
> > php.ini or config.inc.php Arguably though, anything like that which
> > could cause segmentation violations in apache / PHP / phpMyAdmin is
> > a bug in one or other of those packages.
> > 
> > On option (a) the phpMyAdmin port depends on a number of PHP modules
> > -- you need to have mysql, pcre and session but can optionally have
> > the following:
> > 
> > happy-idiot-talk:~:% pkg_info -r phpMyAdmin\* | grep php5
> > Dependency: php5-5.2.0
> > Dependency: php5-zlib-5.2.0
> > Dependency: php5-session-5.2.0
> > Dependency: php5-pcre-5.2.0
> > Dependency: php5-openssl-5.2.0
> > Dependency: php5-mysqli-5.2.0
> > Dependency: php5-mysql-5.2.0
> > Dependency: php5-mcrypt-5.2.0
> > Dependency: php5-mbstring-5.2.0
> > Dependency: php5-gd-5.2.0
> > Dependency: php5-bz2-5.2.0
> > 
> > On (b) I suggest comparing your php.ini and config.inc.php with the
> > default ones installed with the respective ports and hashing out
> > anything you've modified to see if you can identify what (if anything)
> > in those files might be causing the problem.
> > 
> > Quite frankly though, I'm doing no more than guessing at what the cause
> > of the trouble is and I can't guarantee either of the above is going to
> > get you results. There is undoubtedly some small, overlooked but vital
> > thing which is the key to all this...
> > 
> > 	Cheers,
> > 
> > 	Matthew
> > 
> > -- 
> > Dr Matthew J Seaman MA, D.Phil.                       7 Priory Courtyard
> >                                                       Flat 3
> > PGP: http://www.infracaninophile.co.uk/pgpkey         Ramsgate
> >                                                       Kent, CT11 9PW
> > 
> 
> 
> 
> 
> on a)
> testbox# pkg_info -r phpMyAdmin\* | grep php5
> Dependency: php5-5.1.6_3
> Dependency: php5-zlib-5.1.6_3
> Dependency: php5-session-5.1.6_3
> Dependency: php5-pcre-5.1.6_3
> Dependency: php5-openssl-5.1.6_3
> Dependency: php5-mysqli-5.1.6_3
> Dependency: php5-mysql-5.1.6_3
> Dependency: php5-mcrypt-5.1.6_3
> Dependency: php5-mbstring-5.1.6_3
> Dependency: php5-bz2-5.1.6_3
> Dependency: php5-gd-5.1.6_3
> testbox#
> 
> on b)
> testbox# diff php.ini php.ini-dist
> testbox#
> 
> testbox# diff config.inc.php config.inc.php.sample
> 13,14d12
> < $cfg['Servers'][$i]['user']   = 'root';
> < $cfg['Servers'][$i]['password']       = '********';    [actual password blotted out]
> testbox#
> 
> Other programs like phpSysInfo work OK.
> 
> portupgrade -Rfv phpMyAdmin made no difference.
> 
> I also ran make buildworld and make installworld which also made
> no difference.
> 
> The latest complete ktrace.out is attached to the email I sent to your personal email.
> 
> Terry Todd
> 
> 
> 
> 
> _______________________________________________
> freebsd-questions@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070209205136.A37561>