Skip to content

Commit 5159ae7

Browse files
committed
Fix incorrect properties_info_table access
1 parent 89fb7cf commit 5159ae7

File tree

3 files changed

+9
-10
lines changed

3 files changed

+9
-10
lines changed

Zend/zend_compile.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,10 @@ typedef struct _zend_property_info {
463463
#define OBJ_PROP_TO_OFFSET(num) \
464464
((uint32_t)(XtOffsetOf(zend_object, properties_table) + sizeof(zval) * (num)))
465465
#define OBJ_PROP_TO_NUM(offset) \
466-
((offset - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval))
466+
(((offset) - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval))
467+
468+
#define Z_PROP_TABLE_OFFSET(prop_info) \
469+
OBJ_PROP_TO_NUM(!((prop_info)->prototype->flags & ZEND_ACC_VIRTUAL) ? (prop_info)->prototype->offset : (prop_info)->offset)
467470

468471
typedef struct _zend_class_constant {
469472
zval value; /* flags are stored in u2 */

Zend/zend_inheritance.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,11 +1675,7 @@ void zend_build_properties_info_table(zend_class_entry *ce)
16751675
ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop) {
16761676
if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0
16771677
&& !(prop->flags & ZEND_ACC_VIRTUAL)) {
1678-
if (!(prop->prototype->flags & ZEND_ACC_VIRTUAL)) {
1679-
table[OBJ_PROP_TO_NUM(prop->prototype->offset)] = prop;
1680-
} else {
1681-
table[OBJ_PROP_TO_NUM(prop->offset)] = prop;
1682-
}
1678+
table[Z_PROP_TABLE_OFFSET(prop)] = prop;
16831679
}
16841680
} ZEND_HASH_FOREACH_END();
16851681
}

ext/opcache/jit/zend_jit_ir.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14377,7 +14377,7 @@ static int zend_jit_fetch_obj(zend_jit_ctx *jit,
1437714377
ref = ir_CONST_ADDR(prop_info);
1437814378
} else {
1437914379
int prop_info_offset =
14380-
(((prop_info->prototype->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
14380+
(((Z_PROP_TABLE_OFFSET(prop_info) - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
1438114381

1438214382
ref = ir_LOAD_A(ir_ADD_OFFSET(obj_ref, offsetof(zend_object, ce)));
1438314383
ref = ir_LOAD_A(ir_ADD_OFFSET(ref, offsetof(zend_class_entry, properties_info_table)));
@@ -14778,7 +14778,7 @@ static int zend_jit_assign_obj(zend_jit_ctx *jit,
1477814778
ref = ir_CONST_ADDR(prop_info);
1477914779
} else {
1478014780
int prop_info_offset =
14781-
(((prop_info->prototype->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
14781+
(((Z_PROP_TABLE_OFFSET(prop_info) - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
1478214782

1478314783
ref = ir_LOAD_A(ir_ADD_OFFSET(obj_ref, offsetof(zend_object, ce)));
1478414784
ref = ir_LOAD_A(ir_ADD_OFFSET(ref, offsetof(zend_class_entry, properties_info_table)));
@@ -15134,7 +15134,7 @@ static int zend_jit_assign_obj_op(zend_jit_ctx *jit,
1513415134
ref = ir_CONST_ADDR(prop_info);
1513515135
} else {
1513615136
int prop_info_offset =
15137-
(((prop_info->prototype->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
15137+
(((Z_PROP_TABLE_OFFSET(prop_info) - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
1513815138

1513915139
ref = ir_LOAD_A(ir_ADD_OFFSET(obj_ref, offsetof(zend_object, ce)));
1514015140
ref = ir_LOAD_A(ir_ADD_OFFSET(ref, offsetof(zend_class_entry, properties_info_table)));
@@ -15524,7 +15524,7 @@ static int zend_jit_incdec_obj(zend_jit_ctx *jit,
1552415524
ref = ir_CONST_ADDR(prop_info);
1552515525
} else {
1552615526
int prop_info_offset =
15527-
(((prop_info->prototype->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
15527+
(((Z_PROP_TABLE_OFFSET(prop_info) - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
1552815528

1552915529
ref = ir_LOAD_A(ir_ADD_OFFSET(obj_ref, offsetof(zend_object, ce)));
1553015530
ref = ir_LOAD_A(ir_ADD_OFFSET(ref, offsetof(zend_class_entry, properties_info_table)));

0 commit comments

Comments
 (0)