Skip to content

Commit ebad517

Browse files
committed
Fixed bug #65254 (Exception not catchable when exception thrown in autoload with a namespace).
1 parent eab0760 commit ebad517

File tree

4 files changed

+168
-81
lines changed

4 files changed

+168
-81
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ PHP NEWS
33
?? ??? 2013, PHP 5.4.18
44

55
- Core:
6+
. Fixed bug #65254 (Exception not catchable when exception thrown in autoload
7+
with a namespace). (Laruence)
68
. Fixed bug #65108 (is_callable() triggers Fatal Error).
79
(David Soria Parra, Laruence)
810
. Fixed bug #65088 (Generated configure script is malformed on OpenBSD).

Zend/tests/bug65254.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Bug #65254 (Exception not catchable when exception thrown in autoload with a namespace)
3+
--FILE--
4+
<?php
5+
function __autoload($class)
6+
{
7+
eval("namespace ns_test; class test {}");
8+
9+
throw new \Exception('abcd');
10+
}
11+
12+
try
13+
{
14+
\ns_test\test::go();
15+
}
16+
catch (Exception $e)
17+
{
18+
echo 'caught';
19+
}
20+
--EXPECT--
21+
caught

Zend/zend_vm_def.h

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2229,9 +2229,11 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
22292229
ce = CACHED_PTR(opline->op1.literal->cache_slot);
22302230
} else {
22312231
ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
2232+
if (UNEXPECTED(EG(exception) != NULL)) {
2233+
HANDLE_EXCEPTION();
2234+
}
22322235
if (UNEXPECTED(ce == NULL)) {
2233-
CHECK_EXCEPTION();
2234-
ZEND_VM_NEXT_OPCODE();
2236+
zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
22352237
}
22362238
CACHE_PTR(opline->op1.literal->cache_slot, ce);
22372239
}
@@ -2414,9 +2416,11 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
24142416

24152417
if (Z_TYPE_PP(obj) == IS_STRING) {
24162418
ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC);
2419+
if (UNEXPECTED(EG(exception) != NULL)) {
2420+
HANDLE_EXCEPTION();
2421+
}
24172422
if (UNEXPECTED(ce == NULL)) {
2418-
CHECK_EXCEPTION();
2419-
ZEND_VM_NEXT_OPCODE();
2423+
zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj));
24202424
}
24212425
EX(called_scope) = ce;
24222426
EX(object) = NULL;
@@ -3498,9 +3502,11 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
34983502
ce = CACHED_PTR(opline->op1.literal->cache_slot);
34993503
} else {
35003504
ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
3505+
if (UNEXPECTED(EG(exception) != NULL)) {
3506+
HANDLE_EXCEPTION();
3507+
}
35013508
if (UNEXPECTED(ce == NULL)) {
3502-
CHECK_EXCEPTION();
3503-
ZEND_VM_NEXT_OPCODE();
3509+
zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
35043510
}
35053511
CACHE_PTR(opline->op1.literal->cache_slot, ce);
35063512
}
@@ -3887,15 +3893,17 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
38873893
ce = CACHED_PTR(opline->op2.literal->cache_slot);
38883894
} else {
38893895
ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
3890-
if (UNEXPECTED(ce == NULL)) {
3896+
if (UNEXPECTED(EG(exception) != NULL)) {
38913897
if (OP1_TYPE != IS_CONST && varname == &tmp) {
38923898
zval_dtor(&tmp);
38933899
} else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
38943900
zval_ptr_dtor(&varname);
38953901
}
38963902
FREE_OP1();
3897-
CHECK_EXCEPTION();
3898-
ZEND_VM_NEXT_OPCODE();
3903+
HANDLE_EXCEPTION();
3904+
}
3905+
if (UNEXPECTED(ce == NULL)) {
3906+
zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
38993907
}
39003908
CACHE_PTR(opline->op2.literal->cache_slot, ce);
39013909
}

0 commit comments

Comments
 (0)