com php-src: Fixed bug #62814: NEWS Zend/tests/bug62814.phpt Zend/zend_inheritance.c
| From: | Nikita Popov | 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) {