Skip to content

Commit 81607a6

Browse files
committed
Fix type inference
Fixes oss-fuzz #55358
1 parent ec4939b commit 81607a6

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

Zend/Optimizer/zend_inference.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -2537,12 +2537,26 @@ static zend_always_inline int _zend_update_type_info(
25372537
} else if (opline->opcode == ZEND_ASSIGN_OBJ_OP) {
25382538
/* The return value must also satisfy the property type */
25392539
if (prop_info) {
2540-
tmp &= zend_fetch_prop_type(script, prop_info, NULL);
2540+
t1 = zend_fetch_prop_type(script, prop_info, NULL);
2541+
if ((t1 & (MAY_BE_LONG|MAY_BE_DOUBLE)) == MAY_BE_LONG
2542+
&& (tmp & (MAY_BE_LONG|MAY_BE_DOUBLE)) == MAY_BE_DOUBLE) {
2543+
/* DOUBLE may be auto-converted to LONG */
2544+
tmp |= MAY_BE_LONG;
2545+
tmp &= ~MAY_BE_DOUBLE;
2546+
}
2547+
tmp &= t1;
25412548
}
25422549
} else if (opline->opcode == ZEND_ASSIGN_STATIC_PROP_OP) {
25432550
/* The return value must also satisfy the property type */
25442551
if (prop_info) {
2545-
tmp &= zend_fetch_prop_type(script, prop_info, NULL);
2552+
t1 = zend_fetch_prop_type(script, prop_info, NULL);
2553+
if ((t1 & (MAY_BE_LONG|MAY_BE_DOUBLE)) == MAY_BE_LONG
2554+
&& (tmp & (MAY_BE_LONG|MAY_BE_DOUBLE)) == MAY_BE_DOUBLE) {
2555+
/* DOUBLE may be auto-converted to LONG */
2556+
tmp |= MAY_BE_LONG;
2557+
tmp &= ~MAY_BE_DOUBLE;
2558+
}
2559+
tmp &= t1;
25462560
}
25472561
} else {
25482562
if (tmp & MAY_BE_REF) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
JIT ASSIGN_OBJ_OP: invalid type inference
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
--FILE--
9+
<?php
10+
class Foo {
11+
public int $bar=0;
12+
function __construct() {
13+
try {
14+
+$this->bar += 1.3;
15+
} catch(y) {
16+
}
17+
}
18+
}
19+
var_dump(new Foo);
20+
?>
21+
--EXPECTF--
22+
Deprecated: Implicit conversion from float 1.3 to int loses precision in %sassign_obj_op_003.php on line 6
23+
object(Foo)#1 (1) {
24+
["bar"]=>
25+
int(1)
26+
}

0 commit comments

Comments
 (0)