]> granicus.if.org Git - php/commitdiff
- Fixed bug #49908 (throwing exception in __autoload crashes when interface is not...
authorFelipe Pena <felipe@php.net>
Sun, 1 Nov 2009 21:26:03 +0000 (21:26 +0000)
committerFelipe Pena <felipe@php.net>
Sun, 1 Nov 2009 21:26:03 +0000 (21:26 +0000)
Zend/tests/bug49908.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug49908.phpt b/Zend/tests/bug49908.phpt
new file mode 100644 (file)
index 0000000..08d6383
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #49908 (throwing exception in __autoload crashes when interface is not defined)
+--FILE--
+<?php
+
+function __autoload($className) {
+       var_dump($className);
+       
+       if ($className == 'Foo') {
+               class Foo implements Bar {};
+       } else {
+               throw new Exception($className);
+       }
+}
+
+new Foo;
+
+?>
+--EXPECTF--
+%unicode|string%(3) "Foo"
+%unicode|string%(3) "Bar"
+
+Fatal error: Uncaught exception 'Exception' with message 'Bar' in %s:%d
+Stack trace:
+#0 %s(7): __autoload('Bar')
+#1 %s(13): __autoload('Foo')
+#2 {main}
+  thrown in %s on line %d
index 7420f9fdf82430ff9dc3424a8a59e9aa9c860bbc..cbeffa4df6d858d909c5f7662dfd662ce1500dd5 100644 (file)
@@ -4453,12 +4453,13 @@ ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST)
        zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
        zend_class_entry *iface = zend_u_fetch_class(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
 
-       if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
-               zend_error_noreturn(E_ERROR, "%v cannot implement %v - it is not an interface", ce->name, iface->name);
+       if (iface) {
+               if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
+                       zend_error_noreturn(E_ERROR, "%v cannot implement %v - it is not an interface", ce->name, iface->name);
+               }
+               zend_do_implement_interface(ce, iface TSRMLS_CC);
        }
 
-       zend_do_implement_interface(ce, iface TSRMLS_CC);
-
        ZEND_VM_NEXT_OPCODE();
 }
 
index 8b0c651c85c2f34ceb9b7a9d2f6ef289ec742eab..f1b16ccdd5aa26969f2be225297ca1e4739b6041 100644 (file)
@@ -902,12 +902,13 @@ static int ZEND_FASTCALL  ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HAND
        zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
        zend_class_entry *iface = zend_u_fetch_class(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
 
-       if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
-               zend_error_noreturn(E_ERROR, "%v cannot implement %v - it is not an interface", ce->name, iface->name);
+       if (iface) {
+               if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
+                       zend_error_noreturn(E_ERROR, "%v cannot implement %v - it is not an interface", ce->name, iface->name);
+               }
+               zend_do_implement_interface(ce, iface TSRMLS_CC);
        }
 
-       zend_do_implement_interface(ce, iface TSRMLS_CC);
-
        ZEND_VM_NEXT_OPCODE();
 }