com php-src: Fixed bug #62814: NEWS Zend/tests/bug62814.phpt Zend/zend_inheritance.c

From: Date: Tue, 29 Mar 2016 17:08:17 +0000
Subject: com php-src: Fixed bug #62814: NEWS Zend/tests/bug62814.phpt Zend/zend_inheritance.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-91543@lists.php.net to get a copy of this message
Commit: 32294a25c84106e3f34c64137acfecbe3e16aef2 Author: Nikita Popov <nikic@php.net> Tue, 29 Mar 2016 19:07:14 +0200 Parents: 20a87bd007ceb3388f50935430e4fc9dc49c25c1 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=32294a25c84106e3f34c64137acfecbe3e16aef2 Log: Fixed bug #62814 Bugs: https://bugs..php.net/62814 Changed paths: M NEWS A Zend/tests/bug62814.phpt M Zend/zend_inheritance.c Diff: diff --git a/NEWS b/NEWS index 604cf48..f677f0a 100644 --- a/NEWS +++ b/NEWS @@ -4,8 +4,10 @@ PHP NEWS - Core: . Fixed bug #62210 (Exceptions can leak temporary variables). (Dmitry, Bob) + . Fixed bug #62814 (It is possible to stiffen child class members visibility). + (Nikita) . Fixed bug #69989 (Generators don't participate in cycle GC). (Nikita) - . Fixed buf #71572 (String offset assignment from an empty string inserts + . Fixed bug #71572 (String offset assignment from an empty string inserts null byte). (Francois) . Implemented the RFC Support Class Constant Visibility. (Sean DuBois, Reeze Xia, Dmitry) diff --git a/Zend/tests/bug62814.phpt b/Zend/tests/bug62814.phpt new file mode 100644 index 0000000..6646aa2 --- /dev/null +++ b/Zend/tests/bug62814.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #62814: It is possible to stiffen child class members visibility +--FILE-- +<?php + +class A { + private function test() { } +} + +class B extends A { + protected function test() { } +} + +class C extends B { + private function test() { } +} + +?> +--EXPECTF-- +Fatal error: Access level to C::test() must be protected (as in class B) or weaker in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 1f74000..1243552 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -546,17 +546,17 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child)); } + /* Prevent derived classes from restricting access that was available in parent classes */ + if (UNEXPECTED((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK))) { + zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), ZSTR_VAL(child->common.function_name), zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); + } + + if (((child_flags & ZEND_ACC_PPP_MASK) < (parent_flags & ZEND_ACC_PPP_MASK)) + && ((parent_flags & ZEND_ACC_PPP_MASK) & ZEND_ACC_PRIVATE)) { + child->common.fn_flags |= ZEND_ACC_CHANGED; + } if (parent_flags & ZEND_ACC_CHANGED) { child->common.fn_flags |= ZEND_ACC_CHANGED; - } else { - /* Prevent derived classes from restricting access that was available in parent classes - */ - if (UNEXPECTED((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK))) { - zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), ZSTR_VAL(child->common.function_name), zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); - } else if (((child_flags & ZEND_ACC_PPP_MASK) < (parent_flags & ZEND_ACC_PPP_MASK)) - && ((parent_flags & ZEND_ACC_PPP_MASK) & ZEND_ACC_PRIVATE)) { - child->common.fn_flags |= ZEND_ACC_CHANGED; - } } if (parent_flags & ZEND_ACC_PRIVATE) {

« previous php.cvs (#91543) next »