Skip to content

Commit d953cd1

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Avoid non-object in FE_FREE
2 parents fbf221c + 304141e commit d953cd1

File tree

2 files changed

+40
-25
lines changed

2 files changed

+40
-25
lines changed

Zend/zend_vm_def.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6496,15 +6496,18 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
64966496
properties = zobj->handlers->get_properties(zobj);
64976497
}
64986498

6499-
if (zend_hash_num_elements(properties) == 0) {
6500-
ZEND_VM_C_GOTO(fe_reset_r_empty);
6501-
}
6502-
65036499
result = EX_VAR(opline->result.var);
65046500
ZVAL_COPY_VALUE(result, array_ptr);
65056501
if (OP1_TYPE != IS_TMP_VAR) {
65066502
Z_ADDREF_P(array_ptr);
65076503
}
6504+
6505+
if (zend_hash_num_elements(properties) == 0) {
6506+
Z_FE_ITER_P(result) = (uint32_t) -1;
6507+
FREE_OP1_IF_VAR();
6508+
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
6509+
}
6510+
65086511
Z_FE_ITER_P(result) = zend_hash_iterator_add(properties, 0);
65096512
FREE_OP1_IF_VAR();
65106513
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -6522,7 +6525,6 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
65226525
}
65236526
} else {
65246527
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
6525-
ZEND_VM_C_LABEL(fe_reset_r_empty):
65266528
ZVAL_UNDEF(EX_VAR(opline->result.var));
65276529
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
65286530
FREE_OP1();
@@ -6595,6 +6597,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
65956597
properties = Z_OBJPROP_P(array_ptr);
65966598
if (zend_hash_num_elements(properties) == 0) {
65976599
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
6600+
FREE_OP1_VAR_PTR();
65986601
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
65996602
}
66006603

Zend/zend_vm_execute.h

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4805,15 +4805,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
48054805
properties = zobj->handlers->get_properties(zobj);
48064806
}
48074807

4808-
if (zend_hash_num_elements(properties) == 0) {
4809-
goto fe_reset_r_empty;
4810-
}
4811-
48124808
result = EX_VAR(opline->result.var);
48134809
ZVAL_COPY_VALUE(result, array_ptr);
48144810
if (IS_CONST != IS_TMP_VAR) {
48154811
Z_ADDREF_P(array_ptr);
48164812
}
4813+
4814+
if (zend_hash_num_elements(properties) == 0) {
4815+
Z_FE_ITER_P(result) = (uint32_t) -1;
4816+
4817+
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
4818+
}
4819+
48174820
Z_FE_ITER_P(result) = zend_hash_iterator_add(properties, 0);
48184821

48194822
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -4830,7 +4833,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
48304833
}
48314834
} else {
48324835
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
4833-
fe_reset_r_empty:
48344836
ZVAL_UNDEF(EX_VAR(opline->result.var));
48354837
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
48364838

@@ -4903,6 +4905,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
49034905
properties = Z_OBJPROP_P(array_ptr);
49044906
if (zend_hash_num_elements(properties) == 0) {
49054907
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
4908+
49064909
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
49074910
}
49084911

@@ -18812,15 +18815,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
1881218815
properties = zobj->handlers->get_properties(zobj);
1881318816
}
1881418817

18815-
if (zend_hash_num_elements(properties) == 0) {
18816-
goto fe_reset_r_empty;
18817-
}
18818-
1881918818
result = EX_VAR(opline->result.var);
1882018819
ZVAL_COPY_VALUE(result, array_ptr);
1882118820
if (IS_TMP_VAR != IS_TMP_VAR) {
1882218821
Z_ADDREF_P(array_ptr);
1882318822
}
18823+
18824+
if (zend_hash_num_elements(properties) == 0) {
18825+
Z_FE_ITER_P(result) = (uint32_t) -1;
18826+
18827+
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
18828+
}
18829+
1882418830
Z_FE_ITER_P(result) = zend_hash_iterator_add(properties, 0);
1882518831

1882618832
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -18838,7 +18844,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
1883818844
}
1883918845
} else {
1884018846
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
18841-
fe_reset_r_empty:
1884218847
ZVAL_UNDEF(EX_VAR(opline->result.var));
1884318848
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
1884418849
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -18911,6 +18916,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
1891118916
properties = Z_OBJPROP_P(array_ptr);
1891218917
if (zend_hash_num_elements(properties) == 0) {
1891318918
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
18919+
1891418920
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
1891518921
}
1891618922

@@ -21374,15 +21380,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
2137421380
properties = zobj->handlers->get_properties(zobj);
2137521381
}
2137621382

21377-
if (zend_hash_num_elements(properties) == 0) {
21378-
goto fe_reset_r_empty;
21379-
}
21380-
2138121383
result = EX_VAR(opline->result.var);
2138221384
ZVAL_COPY_VALUE(result, array_ptr);
2138321385
if (IS_VAR != IS_TMP_VAR) {
2138421386
Z_ADDREF_P(array_ptr);
2138521387
}
21388+
21389+
if (zend_hash_num_elements(properties) == 0) {
21390+
Z_FE_ITER_P(result) = (uint32_t) -1;
21391+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
21392+
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
21393+
}
21394+
2138621395
Z_FE_ITER_P(result) = zend_hash_iterator_add(properties, 0);
2138721396
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2138821397
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -21400,7 +21409,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
2140021409
}
2140121410
} else {
2140221411
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
21403-
fe_reset_r_empty:
2140421412
ZVAL_UNDEF(EX_VAR(opline->result.var));
2140521413
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
2140621414
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -21473,6 +21481,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
2147321481
properties = Z_OBJPROP_P(array_ptr);
2147421482
if (zend_hash_num_elements(properties) == 0) {
2147521483
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
21484+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2147621485
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
2147721486
}
2147821487

@@ -38086,15 +38095,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
3808638095
properties = zobj->handlers->get_properties(zobj);
3808738096
}
3808838097

38089-
if (zend_hash_num_elements(properties) == 0) {
38090-
goto fe_reset_r_empty;
38091-
}
38092-
3809338098
result = EX_VAR(opline->result.var);
3809438099
ZVAL_COPY_VALUE(result, array_ptr);
3809538100
if (IS_CV != IS_TMP_VAR) {
3809638101
Z_ADDREF_P(array_ptr);
3809738102
}
38103+
38104+
if (zend_hash_num_elements(properties) == 0) {
38105+
Z_FE_ITER_P(result) = (uint32_t) -1;
38106+
38107+
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
38108+
}
38109+
3809838110
Z_FE_ITER_P(result) = zend_hash_iterator_add(properties, 0);
3809938111

3810038112
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -38111,7 +38123,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
3811138123
}
3811238124
} else {
3811338125
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
38114-
fe_reset_r_empty:
3811538126
ZVAL_UNDEF(EX_VAR(opline->result.var));
3811638127
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
3811738128

@@ -38184,6 +38195,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
3818438195
properties = Z_OBJPROP_P(array_ptr);
3818538196
if (zend_hash_num_elements(properties) == 0) {
3818638197
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
38198+
3818738199
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
3818838200
}
3818938201

0 commit comments

Comments
 (0)