Hi,

2010/11/19 Joe Orton <jor...@redhat.com>

> The check to prevent extract() overwriting $GLOBALS got broken at some
> point - here's a fix:
>
> Index: ext/standard/array.c
> ===================================================================
> --- ext/standard/array.c        (revision 305556)
> +++ ext/standard/array.c        (working copy)
> @@ -1389,10 +1389,10 @@
>
>                        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);
> Index: ext/standard/tests/array/extract_safety.phpt
> ===================================================================
> --- ext/standard/tests/array/extract_safety.phpt        (revision 0)
> +++ ext/standard/tests/array/extract_safety.phpt        (revision 0)
> @@ -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
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
I committed your fix in the 5.2, 5.3 and trunk.

Thanks for the patch!

-- 
Regards,
Felipe Pena

Reply via email to