Skip to content

Commit 019fd1d

Browse files
committed
Merge branch 'PHP-7.2' into PHP-7.3
2 parents 461e140 + 9ad9cc7 commit 019fd1d

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ PHP NEWS
1919
- Standard:
2020
. Fixed bug #77664 (Segmentation fault when using undefined constant in
2121
custom wrapper). (Laruence)
22+
. Fixed bug #77669 (Crash in extract() when overwriting extracted array).
23+
(Nikita)
2224

2325
21 Feb 2019, PHP 7.3.3
2426

ext/standard/array.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2485,35 +2485,33 @@ PHP_FUNCTION(extract)
24852485
break;
24862486
}
24872487
} else {
2488+
/* The array might be stored in a local variable that will be overwritten */
2489+
zval array_copy;
2490+
ZVAL_COPY(&array_copy, var_array_param);
24882491
switch (extract_type) {
24892492
case EXTR_IF_EXISTS:
2490-
count = php_extract_if_exists(Z_ARRVAL_P(var_array_param), symbol_table);
2493+
count = php_extract_if_exists(Z_ARRVAL(array_copy), symbol_table);
24912494
break;
24922495
case EXTR_OVERWRITE:
2493-
{
2494-
zval zv;
2495-
/* The array might be stored in a local variable that will be overwritten */
2496-
ZVAL_COPY(&zv, var_array_param);
2497-
count = php_extract_overwrite(Z_ARRVAL(zv), symbol_table);
2498-
zval_ptr_dtor(&zv);
2499-
}
2496+
count = php_extract_overwrite(Z_ARRVAL(array_copy), symbol_table);
25002497
break;
25012498
case EXTR_PREFIX_IF_EXISTS:
2502-
count = php_extract_prefix_if_exists(Z_ARRVAL_P(var_array_param), symbol_table, prefix);
2499+
count = php_extract_prefix_if_exists(Z_ARRVAL(array_copy), symbol_table, prefix);
25032500
break;
25042501
case EXTR_PREFIX_SAME:
2505-
count = php_extract_prefix_same(Z_ARRVAL_P(var_array_param), symbol_table, prefix);
2502+
count = php_extract_prefix_same(Z_ARRVAL(array_copy), symbol_table, prefix);
25062503
break;
25072504
case EXTR_PREFIX_ALL:
2508-
count = php_extract_prefix_all(Z_ARRVAL_P(var_array_param), symbol_table, prefix);
2505+
count = php_extract_prefix_all(Z_ARRVAL(array_copy), symbol_table, prefix);
25092506
break;
25102507
case EXTR_PREFIX_INVALID:
2511-
count = php_extract_prefix_invalid(Z_ARRVAL_P(var_array_param), symbol_table, prefix);
2508+
count = php_extract_prefix_invalid(Z_ARRVAL(array_copy), symbol_table, prefix);
25122509
break;
25132510
default:
2514-
count = php_extract_skip(Z_ARRVAL_P(var_array_param), symbol_table);
2511+
count = php_extract_skip(Z_ARRVAL(array_copy), symbol_table);
25152512
break;
25162513
}
2514+
zval_ptr_dtor(&array_copy);
25172515
}
25182516

25192517
RETURN_LONG(count);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Bug #77669: Crash in extract() when overwriting extracted array
3+
--FILE--
4+
<?php
5+
6+
function test($mode) {
7+
$foo = [];
8+
$foo["foo"] = 42;
9+
$foo["bar"] = 24;
10+
extract($foo, $mode, "");
11+
$prefix_foo = [];
12+
$prefix_foo["foo"] = 42;
13+
$prefix_foo["bar"] = 24;
14+
extract($prefix_foo, $mode, "prefix");
15+
}
16+
17+
test(EXTR_OVERWRITE);
18+
test(EXTR_SKIP);
19+
test(EXTR_IF_EXISTS);
20+
test(EXTR_PREFIX_SAME);
21+
test(EXTR_PREFIX_ALL);
22+
test(EXTR_PREFIX_INVALID);
23+
test(EXTR_PREFIX_IF_EXISTS);
24+
test(EXTR_REFS | EXTR_OVERWRITE);
25+
test(EXTR_REFS | EXTR_SKIP);
26+
test(EXTR_REFS | EXTR_IF_EXISTS);
27+
test(EXTR_REFS | EXTR_PREFIX_SAME);
28+
test(EXTR_REFS | EXTR_PREFIX_ALL);
29+
test(EXTR_REFS | EXTR_PREFIX_INVALID);
30+
test(EXTR_REFS | EXTR_PREFIX_IF_EXISTS);
31+
32+
?>
33+
===DONE===
34+
--EXPECT--
35+
===DONE===

0 commit comments

Comments
 (0)