Skip to content

Commit 77acc8a

Browse files
committed
Fixed bug #79793
Make sure the string key is not released while throwing the undefined index warning.
1 parent 62bec0e commit 77acc8a

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ PHP NEWS
2323
(Nikita)
2424
. Fixed bug #79784 (Use after free if changing array during undef var during
2525
array write fetch). (Nikita)
26+
. Fixed bug #79793 (Use after free if string used in undefined index warning
27+
is changed). (Nikita)
2628

2729
- Fileinfo:
2830
. Fixed bug #79756 (finfo_file crash (FILEINFO_MIME)). (cmb)

Zend/tests/bug79793.phpt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--TEST--
2+
Bug #79793: Use after free if string used in undefined index warning is changed
3+
--FILE--
4+
<?php
5+
6+
$key = "foo";
7+
$key .= "bar";
8+
set_error_handler(function($_, $m) use (&$key) {
9+
echo "$m\n";
10+
$key .= "baz";
11+
});
12+
13+
$ary = [];
14+
$ary[$key]++;
15+
var_dump($ary);
16+
$ary[$key] += 1;
17+
var_dump($ary);
18+
19+
?>
20+
--EXPECT--
21+
Undefined index: foobar
22+
array(1) {
23+
["foobar"]=>
24+
int(1)
25+
}
26+
Undefined index: foobarbaz
27+
array(2) {
28+
["foobar"]=>
29+
int(1)
30+
["foobarbaz"]=>
31+
int(1)
32+
}

Zend/zend_execute.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2181,10 +2181,15 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht
21812181
retval = &EG(uninitialized_zval);
21822182
break;
21832183
case BP_VAR_RW:
2184+
/* Key may be released while throwing the undefined index warning. */
2185+
zend_string_addref(offset_key);
21842186
if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
2187+
zend_string_release(offset_key);
21852188
return NULL;
21862189
}
2187-
/* break missing intentionally */
2190+
retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
2191+
zend_string_release(offset_key);
2192+
break;
21882193
case BP_VAR_W:
21892194
retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
21902195
break;

0 commit comments

Comments
 (0)