From 480f5c4e90541e2ae63bfa2b651d30c992491fa7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 1 Nov 2009 21:26:03 +0000 Subject: [PATCH] - Fixed bug #49908 (throwing exception in __autoload crashes when interface is not defined) --- Zend/tests/bug49908.phpt | 28 ++++++++++++++++++++++++++++ Zend/zend_vm_def.h | 9 +++++---- Zend/zend_vm_execute.h | 9 +++++---- 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/bug49908.phpt diff --git a/Zend/tests/bug49908.phpt b/Zend/tests/bug49908.phpt new file mode 100644 index 0000000000..08d6383d83 --- /dev/null +++ b/Zend/tests/bug49908.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #49908 (throwing exception in __autoload crashes when interface is not defined) +--FILE-- + +--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 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7420f9fdf8..cbeffa4df6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 8b0c651c85..f1b16ccdd5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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(); } -- 2.50.1