Please merge into 5.4 branch as well.

Thanks

On Tue, May 31, 2011 at 11:20 AM, Dmitry Stogov <dmi...@php.net> wrote:
> dmitry                                   Tue, 31 May 2011 09:20:51 +0000
>
> Revision: http://svn.php.net/viewvc?view=revision&revision=311635
>
> Log:
> Fixed bug #54910 (Crash when calling call_user_func with unknown function 
> name)
>
> Bug: http://bugs.php.net/54910 (Assigned) Crash when calling call_user_func 
> with unknown function name
>
> Changed paths:
>    U   php/php-src/branches/PHP_5_3/NEWS
>    A   php/php-src/branches/PHP_5_3/Zend/tests/bug54910.phpt
>    U   php/php-src/branches/PHP_5_3/Zend/zend_API.c
>    A   php/php-src/trunk/Zend/tests/bug54910.phpt
>    U   php/php-src/trunk/Zend/zend_API.c
>
> Modified: php/php-src/branches/PHP_5_3/NEWS
> ===================================================================
> --- php/php-src/branches/PHP_5_3/NEWS   2011-05-31 09:18:23 UTC (rev 311634)
> +++ php/php-src/branches/PHP_5_3/NEWS   2011-05-31 09:20:51 UTC (rev 311635)
> @@ -6,6 +6,8 @@
>  - Increased the backtrack limit from 100000 to 1000000 (Rasmus)
>
>  - Zend Engine:
> +  . Fixed bug #54910 (Crash when calling call_user_func with unknown function
> +    name). (Dmitry)
>   . Fixed bug #54804 (__halt_compiler and imported namespaces).
>     (Pierrick, Felipe)
>   . Fixed bug #54585 (track_errors causes segfault). (Dmitry)
>
> Added: php/php-src/branches/PHP_5_3/Zend/tests/bug54910.phpt
> ===================================================================
> --- php/php-src/branches/PHP_5_3/Zend/tests/bug54910.phpt                     
>           (rev 0)
> +++ php/php-src/branches/PHP_5_3/Zend/tests/bug54910.phpt       2011-05-31 
> 09:20:51 UTC (rev 311635)
> @@ -0,0 +1,28 @@
> +--TEST--
> +Bug #54910 (Crash when calling call_user_func with unknown function name)
> +--FILE--
> +<?php
> +class A {
> +    public function __call($method, $args) {
> +        if (stripos($method, 'get') === 0) {
> +            return $this->get();
> +        }
> +        die("No such method - '$method'\n");
> +    }
> +
> +    protected function get() {
> +        $class = get_class($this);
> +        $call = array($class, 'noSuchMethod');
> +
> +        if (is_callable($call)) {
> +            call_user_func($call);
> +        }
> +    }
> +}
> +
> +class B extends A {}
> +
> +$input = new B();
> +echo $input->getEmail();
> +--EXPECT--
> +No such method - 'noSuchMethod'
>
> Modified: php/php-src/branches/PHP_5_3/Zend/zend_API.c
> ===================================================================
> --- php/php-src/branches/PHP_5_3/Zend/zend_API.c        2011-05-31 09:18:23 
> UTC (rev 311634)
> +++ php/php-src/branches/PHP_5_3/Zend/zend_API.c        2011-05-31 09:20:51 
> UTC (rev 311635)
> @@ -2590,6 +2590,11 @@
>                        if (fcc->function_handler) {
>                                retval = 1;
>                                call_via_handler = 
> (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0;
> +                               if (call_via_handler && !fcc->object_ptr && 
> EG(This) &&
> +                                   Z_OBJ_HT_P(EG(This))->get_class_entry &&
> +                                   instanceof_function(Z_OBJCE_P(EG(This)), 
> fcc->calling_scope TSRMLS_CC)) {
> +                                       fcc->object_ptr = EG(This);
> +                               }
>                        }
>                }
>        }
>
> Added: php/php-src/trunk/Zend/tests/bug54910.phpt
> ===================================================================
> --- php/php-src/trunk/Zend/tests/bug54910.phpt                          (rev 
> 0)
> +++ php/php-src/trunk/Zend/tests/bug54910.phpt  2011-05-31 09:20:51 UTC (rev 
> 311635)
> @@ -0,0 +1,28 @@
> +--TEST--
> +Bug #54910 (Crash when calling call_user_func with unknown function name)
> +--FILE--
> +<?php
> +class A {
> +    public function __call($method, $args) {
> +        if (stripos($method, 'get') === 0) {
> +            return $this->get();
> +        }
> +        die("No such method - '$method'\n");
> +    }
> +
> +    protected function get() {
> +        $class = get_class($this);
> +        $call = array($class, 'noSuchMethod');
> +
> +        if (is_callable($call)) {
> +            call_user_func($call);
> +        }
> +    }
> +}
> +
> +class B extends A {}
> +
> +$input = new B();
> +echo $input->getEmail();
> +--EXPECT--
> +No such method - 'noSuchMethod'
>
> Modified: php/php-src/trunk/Zend/zend_API.c
> ===================================================================
> --- php/php-src/trunk/Zend/zend_API.c   2011-05-31 09:18:23 UTC (rev 311634)
> +++ php/php-src/trunk/Zend/zend_API.c   2011-05-31 09:20:51 UTC (rev 311635)
> @@ -2773,6 +2773,11 @@
>                        if (fcc->function_handler) {
>                                retval = 1;
>                                call_via_handler = 
> (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0;
> +                               if (call_via_handler && !fcc->object_ptr && 
> EG(This) &&
> +                                   Z_OBJ_HT_P(EG(This))->get_class_entry &&
> +                                   instanceof_function(Z_OBJCE_P(EG(This)), 
> fcc->calling_scope TSRMLS_CC)) {
> +                                       fcc->object_ptr = EG(This);
> +                               }
>                        }
>                }
>        }
>
>
> --
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>

--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to