]> granicus.if.org Git - php/commitdiff
Fixed bug #30922 (reflective functions crash PHP when interfaces extend themselves)
authorDmitry Stogov <dmitry@php.net>
Mon, 6 Dec 2004 11:53:30 +0000 (11:53 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 6 Dec 2004 11:53:30 +0000 (11:53 +0000)
Zend/tests/bug30922.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/bug30922.phpt b/Zend/tests/bug30922.phpt
new file mode 100644 (file)
index 0000000..24d7917
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Bug #30922 (reflective functions crash PHP when interfaces extend themselves)
+--FILE--
+<?php
+interface RecurisiveFooFar extends RecurisiveFooFar {}
+class A implements RecurisiveFooFar {}
+
+$a = new A();
+var_dump($a instanceOf A);
+echo "ok\n";
+?>
+--EXPECTF--
+Fatal error: Interface RecurisiveFooFar cannot not implement itself in %sbug30922.php on line %d
index af5ac78f23327416accccf32c4aa8e8e8e46f20d..e229091ca44e64e4d5f85b583524902cf1017401 100644 (file)
@@ -1997,6 +1997,9 @@ static inline void do_implement_interface(zend_class_entry *ce, zend_class_entry
        if (!(ce->ce_flags & ZEND_ACC_INTERFACE) && iface->interface_gets_implemented && iface->interface_gets_implemented(iface, ce TSRMLS_CC) == FAILURE) {
                zend_error(E_CORE_ERROR, "Class %s could not implement interface %s", ce->name, iface->name);
        }
+       if (ce == iface) {
+               zend_error(E_ERROR, "Interface %s cannot not implement itself", ce->name);
+       }
 }