Skip to content

Commit 4d4fe76

Browse files
committed
Fixed bug #81631
We need to save the opline before fetching the operand, as it may throw an undef var warning.
1 parent fac78ee commit 4d4fe76

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ PHP NEWS
99
(Nikita)
1010
. Fixed bug #81626 (Error on use static:: in __сallStatic() wrapped to
1111
Closure::fromCallable()). (Nikita)
12+
. Fixed bug #81631 (::class with dynamic class name may yield wrong line
13+
number). (Nikita)
1214

1315
- FPM:
1416
. Fixed bug #81513 (Future possibility for heap overflow in FPM zlog).

Zend/tests/bug81631.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Bug #81631: ::class with dynamic class name may yield wrong line number
3+
--FILE--
4+
<?php
5+
$a = 0;
6+
var_dump($b::class);
7+
?>
8+
--EXPECTF--
9+
Warning: Undefined variable $b in %s on line 3
10+
11+
Fatal error: Uncaught TypeError: Cannot use "::class" on value of type null in %s:3
12+
Stack trace:
13+
#0 {main}
14+
thrown in %s on line 3

Zend/zend_vm_def.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8415,8 +8415,8 @@ ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, CV|TMPVAR|UNUSED|CLASS_FETCH, ANY)
84158415
USE_OPLINE
84168416

84178417
if (OP1_TYPE != IS_UNUSED) {
8418-
zval *op = GET_OP1_ZVAL_PTR(BP_VAR_R);
84198418
SAVE_OPLINE();
8419+
zval *op = GET_OP1_ZVAL_PTR(BP_VAR_R);
84208420
if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
84218421
ZVAL_DEREF(op);
84228422
if (Z_TYPE_P(op) != IS_OBJECT) {

Zend/zend_vm_execute.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14538,8 +14538,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR_H
1453814538
USE_OPLINE
1453914539

1454014540
if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
14541-
zval *op = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
1454214541
SAVE_OPLINE();
14542+
zval *op = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
1454314543
if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
1454414544
ZVAL_DEREF(op);
1454514545
if (Z_TYPE_P(op) != IS_OBJECT) {
@@ -30855,8 +30855,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_H
3085530855
USE_OPLINE
3085630856

3085730857
if (IS_UNUSED != IS_UNUSED) {
30858-
zval *op = NULL;
3085930858
SAVE_OPLINE();
30859+
zval *op = NULL;
3086030860
if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
3086130861
ZVAL_DEREF(op);
3086230862
if (Z_TYPE_P(op) != IS_OBJECT) {
@@ -38400,8 +38400,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_CV_HANDL
3840038400
USE_OPLINE
3840138401

3840238402
if (IS_CV != IS_UNUSED) {
38403-
zval *op = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
3840438403
SAVE_OPLINE();
38404+
zval *op = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
3840538405
if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
3840638406
ZVAL_DEREF(op);
3840738407
if (Z_TYPE_P(op) != IS_OBJECT) {

0 commit comments

Comments
 (0)