Skip to content

Commit efb014d

Browse files
committed
Reset EG(filename_override) after fatal error
Fixes oss-fuzz #45492
1 parent 0d80bc2 commit efb014d

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

Zend/tests/gh7771_3.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
GH-7771.3 (Incorrect file/line for class constant expression exceptions)
3+
--FILE--
4+
<?php
5+
$classlist = [
6+
'space1\C' => 'class y{const y="$y";}',
7+
'D' => 'class D{const HW=space1\C::y;}'
8+
];
9+
spl_autoload_register(function($class) use ($classlist) {
10+
eval($classlist[$class]);
11+
});
12+
var_dump(D::HW);
13+
?>
14+
--EXPECTF--
15+
Fatal error: Constant expression contains invalid operations in %sgh7771_3.php(7) : eval()'d code(1) : eval()'d code on line 1
16+

Zend/zend_ast.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast
789789
{
790790
zend_string *class_name = zend_ast_get_str(ast->child[0]);
791791
zend_string *const_name = zend_ast_get_str(ast->child[1]);
792+
zval *zv;
793+
bool bailout = 0;
792794

793795
zend_string *previous_filename;
794796
zend_long previous_lineno;
@@ -798,11 +800,18 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast
798800
EG(filename_override) = scope->info.user.filename;
799801
EG(lineno_override) = zend_ast_get_lineno(ast);
800802
}
801-
zval *zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr);
803+
zend_try {
804+
zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr);
805+
} zend_catch {
806+
bailout = 1;
807+
} zend_end_try();
802808
if (scope) {
803809
EG(filename_override) = previous_filename;
804810
EG(lineno_override) = previous_lineno;
805811
}
812+
if (bailout) {
813+
zend_bailout();
814+
}
806815

807816
if (UNEXPECTED(zv == NULL)) {
808817
ZVAL_UNDEF(result);

0 commit comments

Comments
 (0)