Skip to content

Commit 984f95f

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Fix assign-op/inc/dec on untyped hooked property backing value
2 parents 68a1062 + f9df448 commit 984f95f

3 files changed

Lines changed: 118 additions & 57 deletions

File tree

Zend/tests/oss-fuzz-478009707.phpt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
OSS-Fuzz #478009707: Assign-op/inc/dec on untyped hooked property backing value
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public $prop {
8+
set {
9+
$this->prop = $value;
10+
$this->prop += 1;
11+
$this->prop++;
12+
++$this->prop;
13+
}
14+
}
15+
}
16+
17+
$c = new C(1);
18+
$c->prop = 1;
19+
var_dump($c->prop);
20+
21+
?>
22+
--EXPECT--
23+
int(4)

Zend/zend_vm_def.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ ZEND_VM_C_LABEL(assign_op_object):
10701070
}
10711071

10721072
prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
1073-
if (prop_info) {
1073+
if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) {
10741074
/* special case for typed properties */
10751075
zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
10761076
} else {
@@ -1335,7 +1335,8 @@ ZEND_VM_C_LABEL(pre_incdec_object):
13351335
}
13361336
} else {
13371337
prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
1338-
zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
1338+
zend_pre_incdec_property_zval(zptr,
1339+
prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
13391340
}
13401341
} else {
13411342
zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);
@@ -1403,7 +1404,8 @@ ZEND_VM_C_LABEL(post_incdec_object):
14031404
ZVAL_NULL(EX_VAR(opline->result.var));
14041405
} else {
14051406
prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
1406-
zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
1407+
zend_post_incdec_property_zval(zptr,
1408+
prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
14071409
}
14081410
} else {
14091411
zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);

0 commit comments

Comments
 (0)