- Fixed extract() to do not overwrite $GLOBALS and $this when using EXTR_OVERWRITE.

patch by: jorto at redhat dot com
This commit is contained in:
Felipe Pena 2010-11-19 22:06:44 +00:00
parent 9608da9443
commit 897f0b4c27
2 changed files with 26 additions and 2 deletions

View File

@ -1389,10 +1389,10 @@ PHP_FUNCTION(extract)
case EXTR_OVERWRITE:
/* GLOBALS protection */
if (var_exists && var_name_len == sizeof("GLOBALS") && !strcmp(var_name, "GLOBALS")) {
if (var_exists && var_name_len == sizeof("GLOBALS")-1 && !strcmp(var_name, "GLOBALS")) {
break;
}
if (var_exists && var_name_len == sizeof("this") && !strcmp(var_name, "this") && EG(scope) && EG(scope)->name_length != 0) {
if (var_exists && var_name_len == sizeof("this")-1 && !strcmp(var_name, "this") && EG(scope) && EG(scope)->name_length != 0) {
break;
}
ZVAL_STRINGL(&final_name, var_name, var_name_len, 1);

View File

@ -0,0 +1,24 @@
--TEST--
Test extract() for overwrite of GLOBALS
--FILE--
<?php
$str = "John";
debug_zval_dump($GLOBALS["str"]);
/* Extracting Global Variables */
$splat = array("foo" => "bar");
var_dump(extract(array("GLOBALS" => $splat, EXTR_OVERWRITE)));
unset ($splat);
debug_zval_dump($GLOBALS["str"]);
echo "\nDone";
?>
--EXPECTF--
string(4) "John" refcount(2)
int(0)
string(4) "John" refcount(2)
Done