From:             
Operating system: 
PHP version:      5.4.1RC2
Package:          Scripting Engine problem
Bug Type:         Bug
Bug description:__clone/__destruct do not match other methods when checking 
access controls

Description:
------------
__clone and __destruct check access to protected methods differently from
other 
methods. They have 
custom implementation and while other methods allow access to siblings in
the 
same tree to protected 
functions, those do not. See implementation for regular ones:


if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(fbc), 
EG(scope)))) {
        if (zobj->ce->__call) {
                fbc = zend_get_user_call_function(zobj->ce, method_name, 
method_len);
        } else {
                zend_error_noreturn(E_ERROR, "Call to %s method %s::%s() from 
context '%s'", 
zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), 
method_name, EG(scope) ? 
EG(scope)->name : "");
        }
}

and for __clone:


if (UNEXPECTED(!zend_check_protected(clone->common.scope, EG(scope)))) {
        zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from 
context '%s'", ce->name, 
EG(scope) ? EG(scope)->name : "");
}

it can be seen that __clone does not use zend_get_function_root_class().
Same 
happens for destructor.

I see no reason for that and I think they should be brought in sync with
the 
rest of the code. See also: 
http://www.mail-archive.com/internals@lists.php.net/msg57424.html

Test script:
---------------
 abstract class BaseClass {
        abstract protected function __clone();
    }

    class MommasBoy extends BaseClass {
        protected function __clone() {
            echo __METHOD__, "\n";
        }
    }

    class LatchkeyKid extends BaseClass {
        public function __construct() {
            echo 'In ', __CLASS__, ":\n";
            $kid = new MommasBoy();
            $kid = clone $kid;
        }
        public function __clone() {}
    }

    $obj = new LatchkeyKid();


Expected result:
----------------
In LatchkeyKid:
MommasBoy::__clone


Actual result:
--------------
Fatal error: Call to protected MommasBoy::__clone() from context
'LatchkeyKid' in 
bug.php on line 16


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

Reply via email to