Bug #16939 Updated: tokenizer: emalloc causes segfault
| From: | andrei@php.net | Date: | Tue, 21 May 2002 21:24:33 +0000 |
| Subject: | Bug #16939 Updated: tokenizer: emalloc causes segfault | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-8126@lists.php.net to get a copy of this message | ||
ID: 16939
Updated by: andrei@php.net
Reported By: alan@akbkhome.com
-Status: Open
+Status: Closed
Bug Type: Reproducible crash
Operating System: linux
PHP Version: 4.2.0
New Comment:
This bug has been fixed in CVS. You can grab a snapshot of the
CVS version at http://snaps.php.net/. In case this was a
documentation
problem, the fix will show up soon at http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2002-05-04 01:06:00] alan@akbkhome.com
OK, Got a nice simple test case - I'm pretty certain its the tokenizer
code, Andrei :)
-- theres not category for tokenizer yet! :)
test script as follows (modify the directory to point at pear)..
<?
dl('tokenizer.so');
class test {
function testing($f) {
if (!preg_match('/\.(php|class)$/',$f)) return;
echo "$f\n";
$this->data =& token_get_all($f);
}
function recurse($dir) {
$dh = opendir($dir);
while (($f = readdir($dh)) !== FALSE) {
if ($f{0} == ".") continue;
$fn = "{$dir}/{$f}";
if (is_dir($fn)) {
$this->recurse($fn);
continue;
}
// assume its a file
$this->testing($fn);
}
}
}
$t = new test;
// change this to your pear directory.
$t->recurse('/usr/lib/php');
?>
------------------------------------------------------------------------
[2002-05-01 03:09:54] alan@akbkhome.com
Workaround:
Original code did this
$this->tokens = token_get_all($filename)
by not reassigning the same variable on each file, but rather really
storing the token array in a huge array it works around this issue...
(albiet with a huge memory overhead)
$this->all_tokens[$filename] = token_get_all($contents);
$this->tokens =& $this->all_tokens[$filename];
------------------------------------------------------------------------
[2002-05-01 02:40:23] alan@akbkhome.com
A short script to reproduce this
(sorry it not to easy to reproduce without the exact code, I did at one
point get to the situation where adding a extra space in the white
space area solved this!), but I suspect it is that the machine is
running low on memory or something....
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/phpmole-ide/phpmole/tools/uml_generator.class?rev=1.2&content-type=text/vnd.viewcvs-markup
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/phpmole-ide/phpmole/tools/uml_dia.xml.php?rev=1.1&content-type=text/vnd.viewcvs-markup
-- just use it do do a large number of files. eg.
php uml_generator.class /usr/local/php/pear/
Possible reasons that I could think of:
-the tokenizer extension (which may be leaking memory)
-somewhere not exiting if no memory can be allocated and then emalloc /
malloc being called again.
Configuration on this machine (4.2.0RC2), also reproduced with 4.2
release version
'./configure' '--prefix=/usr' '--without-mysql'
'--with-config-file-path=/etc/php4/cgi/' '--enable-dba' '--with-db2'
and tokenizer as a dl'd module
Backtrace
Program received signal SIGSEGV, Segmentation fault.
0x4014db2b in malloc () from /lib/libc.so.6
(gdb) bt
#0 0x4014db2b in malloc () from /lib/libc.so.6
#1 0x4014d1e4 in malloc () from /lib/libc.so.6
#2 0x80c4c5c in _emalloc (size=35) at zend_alloc.c:165
#3 0x80d4b1a in zend_hash_index_update_or_next_insert (ht=0x817ae9c,
h=207,
pData=0xbfffda28, nDataSize=4, pDest=0x0, flag=4) at
zend_hash.c:404
#4 0x80d303a in add_next_index_stringl (arg=0x8326d64, str=0x8268c08
")", length=1,
duplicate=1) at zend_API.c:847
#5 0x401ffc61 in tokenize () from /usr/lib/php4/cgi/tokenizer.so
#6 0x402005ac in zif_token_get_all () from
/usr/lib/php4/cgi/tokenizer.so
#7 0x80eb4b0 in execute (op_array=0x816631c) at ./zend_execute.c:1598
#8 0x80eb679 in execute (op_array=0x8166a84) at ./zend_execute.c:1638
#9 0x80eb679 in execute (op_array=0x816004c) at ./zend_execute.c:1638
#10 0x80d19e8 in zend_execute_scripts (type=8, retval=0x0,
file_count=3) at zend.c:810
#11 0x805e1dd in php_execute_script (primary_file=0xbffffb98) at
main.c:1381
#12 0x805c0ac in main (argc=3, argv=0xbffffc14) at cgi_main.c:785
#13 0x400f86cf in __libc_start_main () from /lib/libc.so.6
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=16939&edit=1