Browse Source

Fix CGI with auto_globals_jit=0

In CGI, php_auto_globals_create_server() (i.e. auto_global_callback() here)
initializes $_ENV to reuse for $_SERVER. However, because $_SERVER is
constructed first, we have not yet initialized auto_global->armed of the $_ENV
global. Split the loop into initialization and constructor phases.

Fixes GH-19934
Closes GH-19870
pull/20033/merge
Ilija Tovilo 1 month ago
parent
commit
9bc35f1982
No known key found for this signature in database GPG Key ID: 115CEA7A713E12E9
  1. 1
      NEWS
  2. 10
      Zend/zend_compile.c
  3. 17
      sapi/cgi/tests/auto_globals_no_jit.phpt

1
NEWS

@ -18,6 +18,7 @@ PHP NEWS
. Fixed bug GH-19480 (error_log php.ini cannot be unset when open_basedir is
configured). (nielsdos)
. Fixed bug GH-20002 (Broken build on *BSD with MSAN). (outtersg)
. Fixed bug GH-19934 (CGI with auto_globals_jit=0 causes uouv). (ilutov)
- CLI:
. Fix useless "Failed to poll event" error logs due to EAGAIN in CLI server

10
Zend/zend_compile.c

@ -1938,12 +1938,12 @@ ZEND_API void zend_activate_auto_globals(void) /* {{{ */
zend_auto_global *auto_global;
ZEND_HASH_MAP_FOREACH_PTR(CG(auto_globals), auto_global) {
if (auto_global->jit) {
auto_global->armed = 1;
} else if (auto_global->auto_global_callback) {
auto_global->armed = auto_global->jit || auto_global->auto_global_callback;
} ZEND_HASH_FOREACH_END();
ZEND_HASH_MAP_FOREACH_PTR(CG(auto_globals), auto_global) {
if (auto_global->armed && !auto_global->jit) {
auto_global->armed = auto_global->auto_global_callback(auto_global->name);
} else {
auto_global->armed = 0;
}
} ZEND_HASH_FOREACH_END();
}

17
sapi/cgi/tests/auto_globals_no_jit.phpt

@ -0,0 +1,17 @@
--TEST--
CGI with auto_globals_jit=0
--INI--
auto_globals_jit=0
--CGI--
--ENV--
FOO=BAR
--FILE--
<?php
var_dump($_SERVER['FOO']);
var_dump($_ENV['FOO']);
var_dump(getenv('FOO'));
?>
--EXPECT--
string(3) "BAR"
string(3) "BAR"
string(3) "BAR"
Loading…
Cancel
Save