From:             
Operating system: Linux
PHP version:      5.2SVN-2010-03-29 (snap)
Package:          Reproducible crash
Bug Type:         Bug
Bug description:Problem with method_exists and autoloader

Description:
------------
A call to method_exists may invoke a class loader. If the class loader is
complicated enough, PHP will reallocate the stack to make more room. Once
the class loader returns, PHP will then dereference a variable that is no
longer valid.



Test script:
---------------
<?php

    function recurse($i) {

        if ($i > 0) {

            recurse($i - 1);

        } else {

            class C { }

        }

    }

    function autoload_function($unused) {

        recurse(17);

    }

    spl_autoload_register('autoload_function');

    method_exists('C', 'foo');



Actual result:
--------------
$ gdb --args ./sapi/cli/php crash.php

GNU gdb (GDB) 7.0-ubuntu

Copyright (C) 2009 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "i486-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from
/home/mboland/src/php5.2-201003291630/sapi/cli/php...done.

(gdb) break zif_method_exists 

Breakpoint 1 at 0x832a702: file
/home/mboland/src/php5.2-201003291630/Zend/zend_builtin_functions.c, line
898.

(gdb) r

Starting program: /home/mboland/src/php5.2-201003291630/sapi/cli/php
crash.php

[Thread debugging using libthread_db enabled]



Breakpoint 1, zif_method_exists (ht=2, return_value=0x854e124, 

    return_value_ptr=0x0, this_ptr=0x0, return_value_used=0)

    at
/home/mboland/src/php5.2-201003291630/Zend/zend_builtin_functions.c:898

898             if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &klass,
&method_name)==FAILURE) {

(gdb) n

901             if (Z_TYPE_PP(klass) == IS_OBJECT) {

(gdb) print method_name 

$1 = (zval **) 0x854344c

(gdb) print *method_name

$2 = (zval *) 0x854b6e4

(gdb) print *method_name

$3 = {value = {lval = 139780340, dval = 6.435048036853826e-314, str = {

      val = 0x854e0f4 "foo", len = 3}, ht = 0x854e0f4, obj = {

      handle = 139780340, handlers = 0x3}}, refcount = 1, type = 6 '\006',


  is_ref = 0 '\000'}

(gdb) watch *method_name 

Hardware watchpoint 2: *method_name

(gdb) c

Continuing.

Hardware watchpoint 2: *method_name



Old value = (zval *) 0x854b6e4

New value = (zval *) 0x5a5a5a5a

memset () at ../sysdeps/i386/i686/memset.S:85

85      ../sysdeps/i386/i686/memset.S: No such file or directory.

        in ../sysdeps/i386/i686/memset.S

Current language:  auto

The current source language is "auto; currently asm".

(gdb) bt

#0  memset () at ../sysdeps/i386/i686/memset.S:85

#1  0x082fc11c in _zend_mm_free_int (heap=0x848a1d8, p=0x8543444, 

    __zend_filename=0x845db80
"/home/mboland/src/php5.2-201003291630/Zend/zend_ptr_stack.h",
__zend_lineno=73, __zend_orig_filename=0x0, __zend_orig_lineno=0)

    at /home/mboland/src/php5.2-201003291630/Zend/zend_alloc.c:1952

#2  0x082fcdd0 in _zend_mm_realloc_int (heap=0x848a1d8, p=0x8543444,
size=520, 

    __zend_filename=0x845db80
"/home/mboland/src/php5.2-201003291630/Zend/zend_ptr_stack.h",
__zend_lineno=73, __zend_orig_filename=0x0, __zend_orig_lineno=0)

    at /home/mboland/src/php5.2-201003291630/Zend/zend_alloc.c:2237

#3  0x082fd040 in _erealloc (ptr=0x8543444, size=520, allow_failure=0, 

    __zend_filename=0x845db80
"/home/mboland/src/php5.2-201003291630/Zend/zend_ptr_stack.h",
__zend_lineno=73, __zend_orig_filename=0x0, __zend_orig_lineno=0)

    at /home/mboland/src/php5.2-201003291630/Zend/zend_alloc.c:2321

#4  0x0833ca69 in zend_ptr_stack_2_push (stack=0x8489580, a=0x1, b=0x0)

    at /home/mboland/src/php5.2-201003291630/Zend/zend_ptr_stack.h:73



-- 
Edit bug report at http://bugs.php.net/bug.php?id=51431&edit=1
-- 
Try a snapshot (PHP 5.2):            
http://bugs.php.net/fix.php?id=51431&r=trysnapshot52
Try a snapshot (PHP 5.3):            
http://bugs.php.net/fix.php?id=51431&r=trysnapshot53
Try a snapshot (PHP 6.0):            
http://bugs.php.net/fix.php?id=51431&r=trysnapshot60
Fixed in SVN:                        
http://bugs.php.net/fix.php?id=51431&r=fixed
Fixed in SVN and need be documented: 
http://bugs.php.net/fix.php?id=51431&r=needdocs
Fixed in release:                    
http://bugs.php.net/fix.php?id=51431&r=alreadyfixed
Need backtrace:                      
http://bugs.php.net/fix.php?id=51431&r=needtrace
Need Reproduce Script:               
http://bugs.php.net/fix.php?id=51431&r=needscript
Try newer version:                   
http://bugs.php.net/fix.php?id=51431&r=oldversion
Not developer issue:                 
http://bugs.php.net/fix.php?id=51431&r=support
Expected behavior:                   
http://bugs.php.net/fix.php?id=51431&r=notwrong
Not enough info:                     
http://bugs.php.net/fix.php?id=51431&r=notenoughinfo
Submitted twice:                     
http://bugs.php.net/fix.php?id=51431&r=submittedtwice
register_globals:                    
http://bugs.php.net/fix.php?id=51431&r=globals
PHP 4 support discontinued:          http://bugs.php.net/fix.php?id=51431&r=php4
Daylight Savings:                    http://bugs.php.net/fix.php?id=51431&r=dst
IIS Stability:                       
http://bugs.php.net/fix.php?id=51431&r=isapi
Install GNU Sed:                     
http://bugs.php.net/fix.php?id=51431&r=gnused
Floating point limitations:          
http://bugs.php.net/fix.php?id=51431&r=float
No Zend Extensions:                  
http://bugs.php.net/fix.php?id=51431&r=nozend
MySQL Configuration Error:           
http://bugs.php.net/fix.php?id=51431&r=mysqlcfg

Reply via email to