Skip to content

Commit 443cc31

Browse files
committed
Fix assign-op/inc/dec on untyped hooked property backing value
Fixes OSS-Fuzz #478009707
1 parent b8fc6bd commit 443cc31

3 files changed

Lines changed: 73 additions & 30 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 {
@@ -1326,7 +1326,8 @@ ZEND_VM_C_LABEL(pre_incdec_object):
13261326
}
13271327
} else {
13281328
prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
1329-
zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
1329+
zend_pre_incdec_property_zval(zptr,
1330+
prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
13301331
}
13311332
} else {
13321333
zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);
@@ -1394,7 +1395,8 @@ ZEND_VM_C_LABEL(post_incdec_object):
13941395
ZVAL_NULL(EX_VAR(opline->result.var));
13951396
} else {
13961397
prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
1397-
zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
1398+
zend_post_incdec_property_zval(zptr,
1399+
prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
13981400
}
13991401
} else {
14001402
zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);

Zend/zend_vm_execute.h

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

0 commit comments

Comments
 (0)