Skip to content

Commit 67bb792

Browse files
committed
Don't execute INCLUDE for empty op_arrays.
1 parent 79fac32 commit 67bb792

File tree

2 files changed

+80
-20
lines changed

2 files changed

+80
-20
lines changed

Zend/zend_vm_def.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6286,10 +6286,24 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSER
62866286
if (RETURN_VALUE_USED(opline)) {
62876287
ZVAL_TRUE(EX_VAR(opline->result.var));
62886288
}
6289-
} else if (EXPECTED(new_op_array != NULL)) {
6289+
} else if (UNEXPECTED(new_op_array == NULL)) {
6290+
if (RETURN_VALUE_USED(opline)) {
6291+
ZVAL_FALSE(EX_VAR(opline->result.var));
6292+
}
6293+
} else if (new_op_array->last == 1
6294+
&& new_op_array->opcodes[0].opcode == ZEND_RETURN
6295+
&& new_op_array->opcodes[0].op1_type == IS_CONST) {
6296+
if (RETURN_VALUE_USED(opline)) {
6297+
const zend_op *op = new_op_array->opcodes;
6298+
6299+
ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
6300+
}
6301+
zend_destroy_static_vars(new_op_array);
6302+
destroy_op_array(new_op_array);
6303+
efree_size(new_op_array, sizeof(zend_op_array));
6304+
} else {
62906305
zval *return_value = NULL;
62916306
zend_execute_data *call;
6292-
62936307
if (RETURN_VALUE_USED(opline)) {
62946308
return_value = EX_VAR(opline->result.var);
62956309
}
@@ -6328,8 +6342,6 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSER
63286342
UNDEF_RESULT();
63296343
HANDLE_EXCEPTION();
63306344
}
6331-
} else if (RETURN_VALUE_USED(opline)) {
6332-
ZVAL_FALSE(EX_VAR(opline->result.var));
63336345
}
63346346
FREE_OP1();
63356347
ZEND_VM_NEXT_OPCODE();

Zend/zend_vm_execute.h

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4864,10 +4864,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
48644864
if (RETURN_VALUE_USED(opline)) {
48654865
ZVAL_TRUE(EX_VAR(opline->result.var));
48664866
}
4867-
} else if (EXPECTED(new_op_array != NULL)) {
4867+
} else if (UNEXPECTED(new_op_array == NULL)) {
4868+
if (RETURN_VALUE_USED(opline)) {
4869+
ZVAL_FALSE(EX_VAR(opline->result.var));
4870+
}
4871+
} else if (new_op_array->last == 1
4872+
&& new_op_array->opcodes[0].opcode == ZEND_RETURN
4873+
&& new_op_array->opcodes[0].op1_type == IS_CONST) {
4874+
if (RETURN_VALUE_USED(opline)) {
4875+
const zend_op *op = new_op_array->opcodes;
4876+
4877+
ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
4878+
}
4879+
zend_destroy_static_vars(new_op_array);
4880+
destroy_op_array(new_op_array);
4881+
efree_size(new_op_array, sizeof(zend_op_array));
4882+
} else {
48684883
zval *return_value = NULL;
48694884
zend_execute_data *call;
4870-
48714885
if (RETURN_VALUE_USED(opline)) {
48724886
return_value = EX_VAR(opline->result.var);
48734887
}
@@ -4906,8 +4920,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
49064920
UNDEF_RESULT();
49074921
HANDLE_EXCEPTION();
49084922
}
4909-
} else if (RETURN_VALUE_USED(opline)) {
4910-
ZVAL_FALSE(EX_VAR(opline->result.var));
49114923
}
49124924

49134925
ZEND_VM_NEXT_OPCODE();
@@ -4934,10 +4946,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER_
49344946
if (RETURN_VALUE_USED(opline)) {
49354947
ZVAL_TRUE(EX_VAR(opline->result.var));
49364948
}
4937-
} else if (EXPECTED(new_op_array != NULL)) {
4949+
} else if (UNEXPECTED(new_op_array == NULL)) {
4950+
if (RETURN_VALUE_USED(opline)) {
4951+
ZVAL_FALSE(EX_VAR(opline->result.var));
4952+
}
4953+
} else if (new_op_array->last == 1
4954+
&& new_op_array->opcodes[0].opcode == ZEND_RETURN
4955+
&& new_op_array->opcodes[0].op1_type == IS_CONST) {
4956+
if (RETURN_VALUE_USED(opline)) {
4957+
const zend_op *op = new_op_array->opcodes;
4958+
4959+
ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
4960+
}
4961+
zend_destroy_static_vars(new_op_array);
4962+
destroy_op_array(new_op_array);
4963+
efree_size(new_op_array, sizeof(zend_op_array));
4964+
} else {
49384965
zval *return_value = NULL;
49394966
zend_execute_data *call;
4940-
49414967
if (RETURN_VALUE_USED(opline)) {
49424968
return_value = EX_VAR(opline->result.var);
49434969
}
@@ -4976,8 +5002,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER_
49765002
UNDEF_RESULT();
49775003
HANDLE_EXCEPTION();
49785004
}
4979-
} else if (RETURN_VALUE_USED(opline)) {
4980-
ZVAL_FALSE(EX_VAR(opline->result.var));
49815005
}
49825006
FREE_OP(opline->op1_type, opline->op1.var);
49835007
ZEND_VM_NEXT_OPCODE();
@@ -14502,10 +14526,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
1450214526
if (RETURN_VALUE_USED(opline)) {
1450314527
ZVAL_TRUE(EX_VAR(opline->result.var));
1450414528
}
14505-
} else if (EXPECTED(new_op_array != NULL)) {
14529+
} else if (UNEXPECTED(new_op_array == NULL)) {
14530+
if (RETURN_VALUE_USED(opline)) {
14531+
ZVAL_FALSE(EX_VAR(opline->result.var));
14532+
}
14533+
} else if (new_op_array->last == 1
14534+
&& new_op_array->opcodes[0].opcode == ZEND_RETURN
14535+
&& new_op_array->opcodes[0].op1_type == IS_CONST) {
14536+
if (RETURN_VALUE_USED(opline)) {
14537+
const zend_op *op = new_op_array->opcodes;
14538+
14539+
ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
14540+
}
14541+
zend_destroy_static_vars(new_op_array);
14542+
destroy_op_array(new_op_array);
14543+
efree_size(new_op_array, sizeof(zend_op_array));
14544+
} else {
1450614545
zval *return_value = NULL;
1450714546
zend_execute_data *call;
14508-
1450914547
if (RETURN_VALUE_USED(opline)) {
1451014548
return_value = EX_VAR(opline->result.var);
1451114549
}
@@ -14544,8 +14582,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
1454414582
UNDEF_RESULT();
1454514583
HANDLE_EXCEPTION();
1454614584
}
14547-
} else if (RETURN_VALUE_USED(opline)) {
14548-
ZVAL_FALSE(EX_VAR(opline->result.var));
1454914585
}
1455014586
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1455114587
ZEND_VM_NEXT_OPCODE();
@@ -38644,10 +38680,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
3864438680
if (RETURN_VALUE_USED(opline)) {
3864538681
ZVAL_TRUE(EX_VAR(opline->result.var));
3864638682
}
38647-
} else if (EXPECTED(new_op_array != NULL)) {
38683+
} else if (UNEXPECTED(new_op_array == NULL)) {
38684+
if (RETURN_VALUE_USED(opline)) {
38685+
ZVAL_FALSE(EX_VAR(opline->result.var));
38686+
}
38687+
} else if (new_op_array->last == 1
38688+
&& new_op_array->opcodes[0].opcode == ZEND_RETURN
38689+
&& new_op_array->opcodes[0].op1_type == IS_CONST) {
38690+
if (RETURN_VALUE_USED(opline)) {
38691+
const zend_op *op = new_op_array->opcodes;
38692+
38693+
ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
38694+
}
38695+
zend_destroy_static_vars(new_op_array);
38696+
destroy_op_array(new_op_array);
38697+
efree_size(new_op_array, sizeof(zend_op_array));
38698+
} else {
3864838699
zval *return_value = NULL;
3864938700
zend_execute_data *call;
38650-
3865138701
if (RETURN_VALUE_USED(opline)) {
3865238702
return_value = EX_VAR(opline->result.var);
3865338703
}
@@ -38686,8 +38736,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
3868638736
UNDEF_RESULT();
3868738737
HANDLE_EXCEPTION();
3868838738
}
38689-
} else if (RETURN_VALUE_USED(opline)) {
38690-
ZVAL_FALSE(EX_VAR(opline->result.var));
3869138739
}
3869238740

3869338741
ZEND_VM_NEXT_OPCODE();

0 commit comments

Comments
 (0)