Skip to content

Commit 2fbec09

Browse files
committed
Fix OSS Fuzz #60734: use-after-free visible in ASAN build
1 parent 6ae9cf4 commit 2fbec09

File tree

6 files changed

+142
-0
lines changed

6 files changed

+142
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
Cannot increment/decrement objects
3+
--FILE--
4+
<?php
5+
class Foo { }
6+
$o = new Foo;
7+
8+
try {
9+
$o++;
10+
} catch (\TypeError $e) {
11+
echo $e->getMessage(), PHP_EOL;
12+
var_dump($o);
13+
}
14+
try {
15+
$o--;
16+
} catch (\TypeError $e) {
17+
echo $e->getMessage(), PHP_EOL;
18+
var_dump($o);
19+
}
20+
try {
21+
++$o;
22+
} catch (\TypeError $e) {
23+
echo $e->getMessage(), PHP_EOL;
24+
var_dump($o);
25+
}
26+
try {
27+
--$o;
28+
} catch (\TypeError $e) {
29+
echo $e->getMessage(), PHP_EOL;
30+
var_dump($o);
31+
}
32+
?>
33+
--EXPECT--
34+
Cannot increment Foo
35+
object(Foo)#1 (0) {
36+
}
37+
Cannot decrement Foo
38+
object(Foo)#1 (0) {
39+
}
40+
Cannot increment Foo
41+
object(Foo)#1 (0) {
42+
}
43+
Cannot decrement Foo
44+
object(Foo)#1 (0) {
45+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
Cannot increment/decrement objects
3+
--FILE--
4+
<?php
5+
class Foo { }
6+
$o = new Foo;
7+
8+
try {
9+
$y = $o++;
10+
} catch (\TypeError $e) {
11+
echo $e->getMessage(), PHP_EOL;
12+
var_dump($o);
13+
}
14+
try {
15+
$y = $o--;
16+
} catch (\TypeError $e) {
17+
echo $e->getMessage(), PHP_EOL;
18+
var_dump($o);
19+
}
20+
try {
21+
$y = ++$o;
22+
} catch (\TypeError $e) {
23+
echo $e->getMessage(), PHP_EOL;
24+
var_dump($o);
25+
}
26+
try {
27+
$y = --$o;
28+
} catch (\TypeError $e) {
29+
echo $e->getMessage(), PHP_EOL;
30+
var_dump($o);
31+
}
32+
?>
33+
--EXPECT--
34+
Cannot increment Foo
35+
object(Foo)#1 (0) {
36+
}
37+
Cannot decrement Foo
38+
object(Foo)#1 (0) {
39+
}
40+
Cannot increment Foo
41+
object(Foo)#1 (0) {
42+
}
43+
Cannot decrement Foo
44+
object(Foo)#1 (0) {
45+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
OSS Fuzz #60734: use-after-free visible in ASAN build pre decrement.
3+
--FILE--
4+
<?php
5+
class Foo{
6+
}
7+
$test = new Foo;
8+
$y = --$test;
9+
?>
10+
--EXPECTF--
11+
Fatal error: Uncaught TypeError: Cannot decrement Foo in %s:%d
12+
Stack trace:
13+
#0 {main}
14+
thrown in %s on line %d
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
OSS Fuzz #60734: use-after-free visible in ASAN build pre increment.
3+
--FILE--
4+
<?php
5+
class Foo{
6+
}
7+
$test = new Foo;
8+
$y = ++$test;
9+
?>
10+
--EXPECTF--
11+
Fatal error: Uncaught TypeError: Cannot increment Foo in %s:%d
12+
Stack trace:
13+
#0 {main}
14+
thrown in %s on line %d

Zend/zend_vm_def.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,10 @@ ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
15011501
}
15021502
increment_function(var_ptr);
15031503
if (UNEXPECTED(EG(exception))) {
1504+
/* Smart branch expects result to be set with exceptions */
1505+
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1506+
ZVAL_NULL(EX_VAR(opline->result.var));
1507+
}
15041508
HANDLE_EXCEPTION();
15051509
}
15061510
} while (0);
@@ -1556,6 +1560,10 @@ ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
15561560
}
15571561
decrement_function(var_ptr);
15581562
if (UNEXPECTED(EG(exception))) {
1563+
/* Smart branch expects result to be set with exceptions */
1564+
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1565+
ZVAL_NULL(EX_VAR(opline->result.var));
1566+
}
15591567
HANDLE_EXCEPTION();
15601568
}
15611569
} while (0);

Zend/zend_vm_execute.h

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

0 commit comments

Comments
 (0)