Skip to content

Commit e45f705

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #79793
2 parents beb002a + 77acc8a commit e45f705

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

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
@@ -2128,10 +2128,15 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht
21282128
retval = &EG(uninitialized_zval);
21292129
break;
21302130
case BP_VAR_RW:
2131+
/* Key may be released while throwing the undefined index warning. */
2132+
zend_string_addref(offset_key);
21312133
if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
2134+
zend_string_release(offset_key);
21322135
return NULL;
21332136
}
2134-
/* break missing intentionally */
2137+
retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
2138+
zend_string_release(offset_key);
2139+
break;
21352140
case BP_VAR_W:
21362141
retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
21372142
break;

ext/opcache/jit/zend_jit_helpers.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,14 @@ static zval* ZEND_FASTCALL zend_jit_hash_lookup_rw(HashTable *ht, zend_string *s
162162
}
163163
}
164164
} else {
165+
/* Key may be released while throwing the undefined index warning. */
166+
zend_string_addref(str);
165167
if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) {
168+
zend_string_release(str);
166169
return NULL;
167170
}
168-
retval = zend_hash_update(ht, str, &EG(uninitialized_zval));
171+
retval = zend_hash_add_new(ht, str, &EG(uninitialized_zval));
172+
zend_string_release(str);
169173
}
170174
return retval;
171175
}
@@ -229,10 +233,14 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_rw(HashTable *ht, zend_strin
229233
}
230234
}
231235
} else {
236+
/* Key may be released while throwing the undefined index warning. */
237+
zend_string_addref(str);
232238
if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) {
239+
zend_string_release(str);
233240
return NULL;
234241
}
235242
retval = zend_hash_add_new(ht, str, &EG(uninitialized_zval));
243+
zend_string_release(str);
236244
}
237245
return retval;
238246
}
@@ -571,10 +579,14 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di
571579
}
572580
}
573581
} else {
582+
/* Key may be released while throwing the undefined index warning. */
583+
zend_string_addref(offset_key);
574584
if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
585+
zend_string_release(offset_key);
575586
return NULL;
576587
}
577588
retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
589+
zend_string_release(offset_key);
578590
}
579591
return retval;
580592

0 commit comments

Comments
 (0)