summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-12-06 11:53:30 +0000
committerDmitry Stogov <dmitry@php.net>2004-12-06 11:53:30 +0000
commit7c83c4e41873c355b5bb0bf73a26208413d3475a (patch)
tree988263447511cea51063c2f2aa9801cd762fc608
parentf0f08ec32bfb1ec1fd1097490f3642735e167432 (diff)
downloadphp-git-7c83c4e41873c355b5bb0bf73a26208413d3475a.tar.gz
Fixed bug #30922 (reflective functions crash PHP when interfaces extend themselves)
-rw-r--r--Zend/tests/bug30922.phpt13
-rw-r--r--Zend/zend_compile.c3
2 files changed, 16 insertions, 0 deletions
diff --git a/Zend/tests/bug30922.phpt b/Zend/tests/bug30922.phpt
new file mode 100644
index 0000000000..24d79171be
--- /dev/null
+++ b/Zend/tests/bug30922.phpt
@@ -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
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index af5ac78f23..e229091ca4 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -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);
+ }
}