Skip to content

Commit a2e3ca1

Browse files
committed
Don't free FETCH_W operand if GLOBAL_LOCK
The error path performed the free unconditionally, while we should not do it for GLOBAL_LOCK. Fixes oss-fuzz #39868.
1 parent 2127b49 commit a2e3ca1

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
To string conversion failure in global
3+
--FILE--
4+
<?php
5+
6+
try {
7+
global ${new stdClass};
8+
} catch (Error $e) {
9+
echo $e->getMessage(), "\n";
10+
}
11+
12+
?>
13+
--EXPECT--
14+
Object of class stdClass could not be converted to string

Zend/zend_vm_def.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1708,7 +1708,9 @@ ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
17081708
}
17091709
name = zval_try_get_tmp_string(varname, &tmp_name);
17101710
if (UNEXPECTED(!name)) {
1711-
FREE_OP1();
1711+
if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
1712+
FREE_OP1();
1713+
}
17121714
ZVAL_UNDEF(EX_VAR(opline->result.var));
17131715
HANDLE_EXCEPTION();
17141716
}

Zend/zend_vm_execute.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9465,7 +9465,9 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_ad
94659465
}
94669466
name = zval_try_get_tmp_string(varname, &tmp_name);
94679467
if (UNEXPECTED(!name)) {
9468+
if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
94689469

9470+
}
94699471
ZVAL_UNDEF(EX_VAR(opline->result.var));
94709472
HANDLE_EXCEPTION();
94719473
}
@@ -17315,7 +17317,9 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_ad
1731517317
}
1731617318
name = zval_try_get_tmp_string(varname, &tmp_name);
1731717319
if (UNEXPECTED(!name)) {
17318-
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
17320+
if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
17321+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
17322+
}
1731917323
ZVAL_UNDEF(EX_VAR(opline->result.var));
1732017324
HANDLE_EXCEPTION();
1732117325
}
@@ -45659,7 +45663,9 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_ad
4565945663
}
4566045664
name = zval_try_get_tmp_string(varname, &tmp_name);
4566145665
if (UNEXPECTED(!name)) {
45666+
if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
4566245667

45668+
}
4566345669
ZVAL_UNDEF(EX_VAR(opline->result.var));
4566445670
HANDLE_EXCEPTION();
4566545671
}

0 commit comments

Comments
 (0)