Skip to content

Commit 28aacbf

Browse files
committed
It's not possible to create reference to string-offset
1 parent 47f9014 commit 28aacbf

File tree

2 files changed

+132
-110
lines changed

2 files changed

+132
-110
lines changed

Zend/zend_vm_def.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,17 +1205,19 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
12051205
if (UNEXPECTED(opline->extended_value != 0)) {
12061206
zval *retval_ptr = EX_VAR(opline->result.var);
12071207

1208-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
1209-
retval_ptr = Z_INDIRECT_P(retval_ptr);
1210-
}
1211-
if (!Z_ISREF_P(retval_ptr)) {
1212-
if (Z_REFCOUNTED_P(retval_ptr)) {
1213-
Z_DELREF_P(retval_ptr);
1214-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
1215-
} else {
1216-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
1208+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
1209+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
1210+
retval_ptr = Z_INDIRECT_P(retval_ptr);
1211+
}
1212+
if (!Z_ISREF_P(retval_ptr)) {
1213+
if (Z_REFCOUNTED_P(retval_ptr)) {
1214+
Z_DELREF_P(retval_ptr);
1215+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
1216+
} else {
1217+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
1218+
}
1219+
Z_ADDREF_P(retval_ptr);
12171220
}
1218-
Z_ADDREF_P(retval_ptr);
12191221
}
12201222
}
12211223

Zend/zend_vm_execute.h

Lines changed: 120 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -14543,17 +14543,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA
1454314543
if (UNEXPECTED(opline->extended_value != 0)) {
1454414544
zval *retval_ptr = EX_VAR(opline->result.var);
1454514545

14546-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
14547-
retval_ptr = Z_INDIRECT_P(retval_ptr);
14548-
}
14549-
if (!Z_ISREF_P(retval_ptr)) {
14550-
if (Z_REFCOUNTED_P(retval_ptr)) {
14551-
Z_DELREF_P(retval_ptr);
14552-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
14553-
} else {
14554-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
14546+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
14547+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
14548+
retval_ptr = Z_INDIRECT_P(retval_ptr);
14549+
}
14550+
if (!Z_ISREF_P(retval_ptr)) {
14551+
if (Z_REFCOUNTED_P(retval_ptr)) {
14552+
Z_DELREF_P(retval_ptr);
14553+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
14554+
} else {
14555+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
14556+
}
14557+
Z_ADDREF_P(retval_ptr);
1455514558
}
14556-
Z_ADDREF_P(retval_ptr);
1455714559
}
1455814560
}
1455914561

@@ -16836,17 +16838,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND
1683616838
if (UNEXPECTED(opline->extended_value != 0)) {
1683716839
zval *retval_ptr = EX_VAR(opline->result.var);
1683816840

16839-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
16840-
retval_ptr = Z_INDIRECT_P(retval_ptr);
16841-
}
16842-
if (!Z_ISREF_P(retval_ptr)) {
16843-
if (Z_REFCOUNTED_P(retval_ptr)) {
16844-
Z_DELREF_P(retval_ptr);
16845-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
16846-
} else {
16847-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
16841+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
16842+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
16843+
retval_ptr = Z_INDIRECT_P(retval_ptr);
16844+
}
16845+
if (!Z_ISREF_P(retval_ptr)) {
16846+
if (Z_REFCOUNTED_P(retval_ptr)) {
16847+
Z_DELREF_P(retval_ptr);
16848+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
16849+
} else {
16850+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
16851+
}
16852+
Z_ADDREF_P(retval_ptr);
1684816853
}
16849-
Z_ADDREF_P(retval_ptr);
1685016854
}
1685116855
}
1685216856

@@ -19026,17 +19030,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
1902619030
if (UNEXPECTED(opline->extended_value != 0)) {
1902719031
zval *retval_ptr = EX_VAR(opline->result.var);
1902819032

19029-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
19030-
retval_ptr = Z_INDIRECT_P(retval_ptr);
19031-
}
19032-
if (!Z_ISREF_P(retval_ptr)) {
19033-
if (Z_REFCOUNTED_P(retval_ptr)) {
19034-
Z_DELREF_P(retval_ptr);
19035-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
19036-
} else {
19037-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
19033+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
19034+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
19035+
retval_ptr = Z_INDIRECT_P(retval_ptr);
19036+
}
19037+
if (!Z_ISREF_P(retval_ptr)) {
19038+
if (Z_REFCOUNTED_P(retval_ptr)) {
19039+
Z_DELREF_P(retval_ptr);
19040+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
19041+
} else {
19042+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
19043+
}
19044+
Z_ADDREF_P(retval_ptr);
1903819045
}
19039-
Z_ADDREF_P(retval_ptr);
1904019046
}
1904119047
}
1904219048

@@ -20954,17 +20960,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_H
2095420960
if (UNEXPECTED(opline->extended_value != 0)) {
2095520961
zval *retval_ptr = EX_VAR(opline->result.var);
2095620962

20957-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
20958-
retval_ptr = Z_INDIRECT_P(retval_ptr);
20959-
}
20960-
if (!Z_ISREF_P(retval_ptr)) {
20961-
if (Z_REFCOUNTED_P(retval_ptr)) {
20962-
Z_DELREF_P(retval_ptr);
20963-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
20964-
} else {
20965-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
20963+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
20964+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
20965+
retval_ptr = Z_INDIRECT_P(retval_ptr);
20966+
}
20967+
if (!Z_ISREF_P(retval_ptr)) {
20968+
if (Z_REFCOUNTED_P(retval_ptr)) {
20969+
Z_DELREF_P(retval_ptr);
20970+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
20971+
} else {
20972+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
20973+
}
20974+
Z_ADDREF_P(retval_ptr);
2096620975
}
20967-
Z_ADDREF_P(retval_ptr);
2096820976
}
2096920977
}
2097020978

@@ -22402,17 +22410,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL
2240222410
if (UNEXPECTED(opline->extended_value != 0)) {
2240322411
zval *retval_ptr = EX_VAR(opline->result.var);
2240422412

22405-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
22406-
retval_ptr = Z_INDIRECT_P(retval_ptr);
22407-
}
22408-
if (!Z_ISREF_P(retval_ptr)) {
22409-
if (Z_REFCOUNTED_P(retval_ptr)) {
22410-
Z_DELREF_P(retval_ptr);
22411-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
22412-
} else {
22413-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
22413+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
22414+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
22415+
retval_ptr = Z_INDIRECT_P(retval_ptr);
22416+
}
22417+
if (!Z_ISREF_P(retval_ptr)) {
22418+
if (Z_REFCOUNTED_P(retval_ptr)) {
22419+
Z_DELREF_P(retval_ptr);
22420+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
22421+
} else {
22422+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
22423+
}
22424+
Z_ADDREF_P(retval_ptr);
2241422425
}
22415-
Z_ADDREF_P(retval_ptr);
2241622426
}
2241722427
}
2241822428

@@ -31598,17 +31608,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
3159831608
if (UNEXPECTED(opline->extended_value != 0)) {
3159931609
zval *retval_ptr = EX_VAR(opline->result.var);
3160031610

31601-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
31602-
retval_ptr = Z_INDIRECT_P(retval_ptr);
31603-
}
31604-
if (!Z_ISREF_P(retval_ptr)) {
31605-
if (Z_REFCOUNTED_P(retval_ptr)) {
31606-
Z_DELREF_P(retval_ptr);
31607-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
31608-
} else {
31609-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
31611+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
31612+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
31613+
retval_ptr = Z_INDIRECT_P(retval_ptr);
31614+
}
31615+
if (!Z_ISREF_P(retval_ptr)) {
31616+
if (Z_REFCOUNTED_P(retval_ptr)) {
31617+
Z_DELREF_P(retval_ptr);
31618+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
31619+
} else {
31620+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
31621+
}
31622+
Z_ADDREF_P(retval_ptr);
3161031623
}
31611-
Z_ADDREF_P(retval_ptr);
3161231624
}
3161331625
}
3161431626

@@ -33673,17 +33685,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
3367333685
if (UNEXPECTED(opline->extended_value != 0)) {
3367433686
zval *retval_ptr = EX_VAR(opline->result.var);
3367533687

33676-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
33677-
retval_ptr = Z_INDIRECT_P(retval_ptr);
33678-
}
33679-
if (!Z_ISREF_P(retval_ptr)) {
33680-
if (Z_REFCOUNTED_P(retval_ptr)) {
33681-
Z_DELREF_P(retval_ptr);
33682-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
33683-
} else {
33684-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
33688+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
33689+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
33690+
retval_ptr = Z_INDIRECT_P(retval_ptr);
33691+
}
33692+
if (!Z_ISREF_P(retval_ptr)) {
33693+
if (Z_REFCOUNTED_P(retval_ptr)) {
33694+
Z_DELREF_P(retval_ptr);
33695+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
33696+
} else {
33697+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
33698+
}
33699+
Z_ADDREF_P(retval_ptr);
3368533700
}
33686-
Z_ADDREF_P(retval_ptr);
3368733701
}
3368833702
}
3368933703

@@ -35738,17 +35752,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
3573835752
if (UNEXPECTED(opline->extended_value != 0)) {
3573935753
zval *retval_ptr = EX_VAR(opline->result.var);
3574035754

35741-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
35742-
retval_ptr = Z_INDIRECT_P(retval_ptr);
35743-
}
35744-
if (!Z_ISREF_P(retval_ptr)) {
35745-
if (Z_REFCOUNTED_P(retval_ptr)) {
35746-
Z_DELREF_P(retval_ptr);
35747-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
35748-
} else {
35749-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
35755+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
35756+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
35757+
retval_ptr = Z_INDIRECT_P(retval_ptr);
35758+
}
35759+
if (!Z_ISREF_P(retval_ptr)) {
35760+
if (Z_REFCOUNTED_P(retval_ptr)) {
35761+
Z_DELREF_P(retval_ptr);
35762+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
35763+
} else {
35764+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
35765+
}
35766+
Z_ADDREF_P(retval_ptr);
3575035767
}
35751-
Z_ADDREF_P(retval_ptr);
3575235768
}
3575335769
}
3575435770

@@ -37540,17 +37556,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HA
3754037556
if (UNEXPECTED(opline->extended_value != 0)) {
3754137557
zval *retval_ptr = EX_VAR(opline->result.var);
3754237558

37543-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
37544-
retval_ptr = Z_INDIRECT_P(retval_ptr);
37545-
}
37546-
if (!Z_ISREF_P(retval_ptr)) {
37547-
if (Z_REFCOUNTED_P(retval_ptr)) {
37548-
Z_DELREF_P(retval_ptr);
37549-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
37550-
} else {
37551-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
37559+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
37560+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
37561+
retval_ptr = Z_INDIRECT_P(retval_ptr);
37562+
}
37563+
if (!Z_ISREF_P(retval_ptr)) {
37564+
if (Z_REFCOUNTED_P(retval_ptr)) {
37565+
Z_DELREF_P(retval_ptr);
37566+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
37567+
} else {
37568+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
37569+
}
37570+
Z_ADDREF_P(retval_ptr);
3755237571
}
37553-
Z_ADDREF_P(retval_ptr);
3755437572
}
3755537573
}
3755637574

@@ -38854,17 +38872,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
3885438872
if (UNEXPECTED(opline->extended_value != 0)) {
3885538873
zval *retval_ptr = EX_VAR(opline->result.var);
3885638874

38857-
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
38858-
retval_ptr = Z_INDIRECT_P(retval_ptr);
38859-
}
38860-
if (!Z_ISREF_P(retval_ptr)) {
38861-
if (Z_REFCOUNTED_P(retval_ptr)) {
38862-
Z_DELREF_P(retval_ptr);
38863-
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
38864-
} else {
38865-
ZVAL_NEW_REF(retval_ptr, retval_ptr);
38875+
if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
38876+
if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
38877+
retval_ptr = Z_INDIRECT_P(retval_ptr);
38878+
}
38879+
if (!Z_ISREF_P(retval_ptr)) {
38880+
if (Z_REFCOUNTED_P(retval_ptr)) {
38881+
Z_DELREF_P(retval_ptr);
38882+
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
38883+
} else {
38884+
ZVAL_NEW_REF(retval_ptr, retval_ptr);
38885+
}
38886+
Z_ADDREF_P(retval_ptr);
3886638887
}
38867-
Z_ADDREF_P(retval_ptr);
3886838888
}
3886938889
}
3887038890

0 commit comments

Comments
 (0)