php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #25338 str_replace segfault
Submitted: 2003-09-01 04:48 UTC Modified: 2003-09-01 06:47 UTC
From: phpbug at zirzow dot dyndns dot org Assigned:
Status: Not a bug Package: Reproducible crash
PHP Version: 4.3.3 OS: FreeBSD 4.7-RELEASE
Private report: No CVE-ID: None
 [2003-09-01 04:48 UTC] phpbug at zirzow dot dyndns dot org
Description:
------------
It appears that repeated calls to a str_replace with a complex array as the subject of replacement, causes php to crash.


Thanks,
Curt

Reproduce code:
---------------
// Demo 1
class foo {
    function foo() {
        reset($GLOBALS);
        while (list($k, $v) = each($GLOBALS)) {
            @$GLOB[$k] = $v;
        }
        $val = str_replace('$', 'asdf', $GLOB);
    }
}
$foo = new foo();
$foo1 = new foo();
$foo2 = new foo();


// Demo 2
// Will issue  a bunch of 'php in free(): warning: chunk is already free'
// After enough of str_replace's it segfaults
while (list($k, $v) = each($GLOBALS)) {
    @$GLOB[$k] = $v;
}
$val = str_replace('$', 'asdf', $GLOB);
$val = str_replace('$', 'asdf', $GLOB);
/* ... repeat till segfault ... */


Actual result:
--------------
back trace 1:
Program received signal SIGSEGV, Segmentation fault.
0x813dd34 in zend_hash_index_update_or_next_insert (ht=0x81fe2ec, h=0, pData=0xbfbfcb98, nDataSize=4, pDest=0xbfbfcbe0, flag=1)
    at /usr/home/curt/source/php-4.3.3/Zend/zend_hash.c:387
387             p = ht->arBuckets[nIndex];
(gdb) bt
#0  0x813dd34 in zend_hash_index_update_or_next_insert (ht=0x81fe2ec, h=0, pData=0xbfbfcb98, nDataSize=4, pDest=0xbfbfcbe0, flag=1)
    at /usr/home/curt/source/php-4.3.3/Zend/zend_hash.c:387
#1  0x813c13f in add_get_index_stringl (arg=0x81fe98c, index=0, str=0x81fe2ec "argc", length=4, dest=0xbfbfcbe0, duplicate=0)
    at /usr/home/curt/source/php-4.3.3/Zend/zend_API.c:917
#2  0x8140af0 in zif_each (ht=1, return_value=0x81fe98c, this_ptr=0x0, return_value_used=1)
    at /usr/home/curt/source/php-4.3.3/Zend/zend_builtin_functions.c:378
#3  0x814bc5c in execute (op_array=0x822740c) at /usr/home/curt/source/php-4.3.3/Zend/zend_execute.c:1618
#4  0x814bdd6 in execute (op_array=0x820398c) at /usr/home/curt/source/php-4.3.3/Zend/zend_execute.c:1660
#5  0x814bdd6 in execute (op_array=0x820088c) at /usr/home/curt/source/php-4.3.3/Zend/zend_execute.c:1660
#6  0x813a1d6 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /usr/home/curt/source/php-4.3.3/Zend/zend.c:885
#7  0x8112351 in php_execute_script (primary_file=0xbfbff6d8) at /usr/home/curt/source/php-4.3.3/main/main.c:1723
#8  0x815368e in main (argc=2, argv=0xbfbff740) at /usr/home/curt/source/php-4.3.3/sapi/cli/php_cli.c:818 
#9  0x8062595 in _start ()


Backtrace 2:
Program received signal SIGSEGV, Segmentation fault.
0x8130075 in zend_do_qm_true (true_value=0x81ff78c, qm_token=0xbfbfd80c, colon_token=0x81bebec)
    at /usr/home/curt/source/php-4.3.3/Zend/zend_compile.c:2352
2352            CG(active_op_array)->opcodes[qm_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array))+1; /*
(gdb) bt
#0  0x8130075 in zend_do_qm_true (true_value=0x81ff78c, qm_token=0xbfbfd80c, colon_token=0x81bebec)
    at /usr/home/curt/source/php-4.3.3/Zend/zend_compile.c:2352
#1  0x8138c36 in _zval_dtor (zvalue=0x81fe8ec) at /usr/home/curt/source/php-4.3.3/Zend/zend_variables.c:51
#2  0x8149401 in execute (op_array=0x820088c) at /usr/home/curt/source/php-4.3.3/Zend/zend_execute.c:470
#3  0x813a1d6 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /usr/home/curt/source/php-4.3.3/Zend/zend.c:885
#4  0x8112351 in php_execute_script (primary_file=0xbfbff6d4) at /usr/home/curt/source/php-4.3.3/main/main.c:1723
#5  0x815368e in main (argc=2, argv=0xbfbff73c) at /usr/home/curt/source/php-4.3.3/sapi/cli/php_cli.c:818
#6  0x8062595 in _start ()


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-09-01 06:47 UTC] sniper@php.net
Yes, this is normal. Don't try accessing GLOBALS like that.

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Apr 29 10:01:30 2024 UTC