]> granicus.if.org Git - php/commitdiff
Fixed bug #71248 (Wrong interface is enforced)
authorDmitry Stogov <dmitry@zend.com>
Wed, 13 Jan 2016 08:41:57 +0000 (11:41 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 13 Jan 2016 08:41:57 +0000 (11:41 +0300)
NEWS
Zend/tests/bug71248.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/NEWS b/NEWS
index 581e12227143bf302785c08bd03b81f064d5df67..9ce138aead042bb78880d1d1121f16b9c600c0fd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ PHP                                                                        NEWS
   . Fix >2G Content-Length headers in apache2handler. (Adam Harvey)
 
 - Core:
+  . Fixed bug #71248 (Wrong interface is enforced). (Dmitry)
   . Fixed bug #71300 (Segfault in zend_fetch_string_offset). (Laruence)
   . Fixed bug #71221 (Null pointer deref (segfault) in get_defined_vars via
     ob_start). (hugh at allthethings dot co dot nz)
diff --git a/Zend/tests/bug71248.phpt b/Zend/tests/bug71248.phpt
new file mode 100644 (file)
index 0000000..6be2585
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #71248 (Wrong interface is enforced)
+--FILE--
+<?php
+class Hint1 { }
+class Hint2 { }
+
+abstract class Base {
+    public function __construct(Hint1 $x) { }
+}
+
+interface Iface {
+    public function __construct(Hint1 $x);
+}
+
+class Foo extends Base implements Iface {
+}
+
+$code = <<<'PHP'
+abstract class Bar extends Base {
+    public function __construct(Hint2 $x) { }
+}
+PHP;
+eval($code);
+?>
+OK
+--EXPECT--
+OK
index ac98627b10ba652572bd5d2950f4d839ed43d8e2..9eb7a0b9c98acedf6a60a633a6681df8ea93bd65 100644 (file)
@@ -585,7 +585,20 @@ static zend_function *do_inherit_method(zend_string *key, zend_function *parent,
        zval *child = zend_hash_find(&ce->function_table, key);
 
        if (child) {
-               do_inheritance_check_on_method((zend_function*)Z_PTR_P(child), parent);
+               zend_function *func = (zend_function*)Z_PTR_P(child);
+               zend_function *orig_prototype = func->common.prototype;
+
+               do_inheritance_check_on_method(func, parent);
+               if (func->common.prototype != orig_prototype &&
+                   func->type == ZEND_USER_FUNCTION &&
+                   func->common.scope != ce &&
+                   !func->op_array.static_variables) {
+                       /* Lazy duplication */
+                       zend_function *new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+                       memcpy(new_function, func, sizeof(zend_op_array));
+                       Z_PTR_P(child) = new_function;
+                       func->common.prototype = orig_prototype;
+               }
                return NULL;
        }