Skip to content

Commit dd04654

Browse files
committed
Error when trying to increment/decrement object offsets
1 parent 0ef62d2 commit dd04654

File tree

4 files changed

+173
-81
lines changed

4 files changed

+173
-81
lines changed

Zend/tests/offsets/increment_decrement_object_offset.phpt

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,28 +65,8 @@ foreach ([new Legacy(), new Container()] as $container) {
6565
?>
6666
--EXPECTF--
6767
new Legacy()[0]
68-
string(20) "Legacy::offsetExists"
69-
string(17) "Legacy::offsetGet"
70-
71-
Notice: Indirect modification of overloaded element of Legacy has no effect in %s on line %d
72-
int(15)
73-
string(17) "Legacy::offsetGet"
74-
int(15)
75-
string(20) "Legacy::offsetExists"
76-
string(17) "Legacy::offsetGet"
77-
78-
Notice: Indirect modification of overloaded element of Legacy has no effect in %s on line %d
79-
int(15)
80-
string(17) "Legacy::offsetGet"
81-
int(15)
68+
Error: Cannot increment/decrement object offsets
69+
Error: Cannot increment/decrement object offsets
8270
new Container()[0]
83-
string(23) "Container::offsetExists"
84-
string(22) "Container::offsetFetch"
85-
int(15)
86-
string(20) "Container::offsetGet"
87-
int(16)
88-
string(23) "Container::offsetExists"
89-
string(22) "Container::offsetFetch"
90-
int(16)
91-
string(20) "Container::offsetGet"
92-
int(15)
71+
Error: Cannot increment/decrement object offsets
72+
Error: Cannot increment/decrement object offsets

Zend/tests/offsets/increment_decrement_operation_order.phpt

Lines changed: 22 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -61,61 +61,35 @@ STDERR[0]
6161
Error: Cannot use a scalar value as an array
6262
Error: Cannot use a scalar value as an array
6363
new stdClass()[0]
64-
Error: Cannot use object of type stdClass as array
65-
Error: Cannot use object of type stdClass as array
64+
Error: Cannot increment/decrement object offsets
65+
Error: Cannot increment/decrement object offsets
6666
new ArrayObject()[0]
67-
68-
Warning: Undefined offset in %s on line %d
69-
NULL
70-
int(1)
67+
Error: Cannot increment/decrement object offsets
68+
Error: Cannot increment/decrement object offsets
7169
new A()[0]
72-
string(15) "A::offsetExists"
73-
int(0)
74-
string(12) "A::offsetGet"
75-
int(0)
76-
77-
Notice: Indirect modification of overloaded element of A has no effect in %s on line %d
78-
int(5)
79-
string(15) "A::offsetExists"
80-
int(0)
81-
string(12) "A::offsetGet"
82-
int(0)
83-
84-
Notice: Indirect modification of overloaded element of A has no effect in %s on line %d
85-
int(5)
70+
Error: Cannot increment/decrement object offsets
71+
Error: Cannot increment/decrement object offsets
8672
new B()[0]
87-
string(15) "B::offsetExists"
88-
int(0)
89-
NULL
90-
string(15) "B::offsetExists"
91-
int(0)
92-
int(1)
73+
Error: Cannot increment/decrement object offsets
74+
Error: Cannot increment/decrement object offsets
9375
new DimensionRead()[0]
94-
Error: Cannot fetch offset of object of type DimensionRead
95-
Error: Cannot fetch offset of object of type DimensionRead
76+
Error: Cannot increment/decrement object offsets
77+
Error: Cannot increment/decrement object offsets
9678
new DimensionFetch()[0]
97-
string(27) "DimensionRead::offsetExists"
98-
int(0)
99-
string(27) "DimensionFetch::offsetFetch"
100-
int(0)
101-
TypeError: Cannot increment DimensionFetch
102-
string(27) "DimensionRead::offsetExists"
103-
int(0)
104-
string(27) "DimensionFetch::offsetFetch"
105-
int(0)
106-
TypeError: Cannot decrement DimensionFetch
79+
Error: Cannot increment/decrement object offsets
80+
Error: Cannot increment/decrement object offsets
10781
new DimensionWrite()[0]
108-
Error: Cannot fetch offset of object of type DimensionWrite
109-
Error: Cannot fetch offset of object of type DimensionWrite
82+
Error: Cannot increment/decrement object offsets
83+
Error: Cannot increment/decrement object offsets
11084
new DimensionReadWrite()[0]
111-
Error: Cannot fetch offset of object of type DimensionReadWrite
112-
Error: Cannot fetch offset of object of type DimensionReadWrite
85+
Error: Cannot increment/decrement object offsets
86+
Error: Cannot increment/decrement object offsets
11387
new DimensionAppend()[0]
114-
Error: Cannot fetch offset of object of type DimensionAppend
115-
Error: Cannot fetch offset of object of type DimensionAppend
88+
Error: Cannot increment/decrement object offsets
89+
Error: Cannot increment/decrement object offsets
11690
new DimensionFetchAppend()[0]
117-
Error: Cannot fetch offset of object of type DimensionFetchAppend
118-
Error: Cannot fetch offset of object of type DimensionFetchAppend
91+
Error: Cannot increment/decrement object offsets
92+
Error: Cannot increment/decrement object offsets
11993
new DimensionUnset()[0]
120-
Error: Cannot fetch offset of object of type DimensionUnset
121-
Error: Cannot fetch offset of object of type DimensionUnset
94+
Error: Cannot increment/decrement object offsets
95+
Error: Cannot increment/decrement object offsets

Zend/zend_vm_def.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1956,7 +1956,23 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
19561956

19571957
SAVE_OPLINE();
19581958
container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1959-
zend_fetch_dimension_address_RW(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1959+
if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
1960+
const zend_op *next_opline = OPLINE + 1;
1961+
if (UNEXPECTED(
1962+
next_opline->opcode == ZEND_PRE_INC
1963+
|| next_opline->opcode == ZEND_PRE_DEC
1964+
|| next_opline->opcode == ZEND_POST_INC
1965+
|| next_opline->opcode == ZEND_POST_DEC
1966+
)) {
1967+
zend_throw_error(NULL, "Cannot increment/decrement object offsets");
1968+
ZVAL_UNDEF(EX_VAR(opline->result.var));
1969+
} else {
1970+
zend_fetch_dimension_address_RW(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1971+
}
1972+
} else {
1973+
zend_fetch_dimension_address_RW(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
1974+
}
1975+
19601976
FREE_OP2();
19611977
if (OP1_TYPE == IS_VAR) {
19621978
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);

Zend/zend_vm_execute.h

Lines changed: 130 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)