diff options
author | Dmitry Stogov <dmitry@php.net> | 2004-12-06 11:53:30 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2004-12-06 11:53:30 +0000 |
commit | 7c83c4e41873c355b5bb0bf73a26208413d3475a (patch) | |
tree | 988263447511cea51063c2f2aa9801cd762fc608 | |
parent | f0f08ec32bfb1ec1fd1097490f3642735e167432 (diff) | |
download | php-git-7c83c4e41873c355b5bb0bf73a26208413d3475a.tar.gz |
Fixed bug #30922 (reflective functions crash PHP when interfaces extend themselves)
-rw-r--r-- | Zend/tests/bug30922.phpt | 13 | ||||
-rw-r--r-- | Zend/zend_compile.c | 3 |
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); + } } |