mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
Fix GH-15905: Assertion failure for TRACK_VARS_SERVER
When the superglobals are eagerly initialized, but "S" is not contained in `variables_order`, `TRACK_VARS_SERVER` is created as empty array with refcount > 1. Since this hash table may later be modified, a flag is set which allows such COW violations for assertions. However, when `register_argc_argv` is on, the so far uninitialized hash table is updated with `argv`, what causes the hash table to be initialized, what drops the allow-COW-violations flag. The following update with `argc` then triggers a refcount violation assertion. Since we consider `HT_ALLOW_COW_VIOLATION` a hack, we do not want to keep the flag during hash table initialization, so we initialize the hash table right away after creation for this code path. Closes GH-15930.
This commit is contained in:
parent
24d5912a30
commit
87d59d7fdd
3 changed files with 14 additions and 0 deletions
1
NEWS
1
NEWS
|
@ -5,6 +5,7 @@ PHP NEWS
|
|||
- Core:
|
||||
. Fixed bug GH-15712: zend_strtod overflow with precision INI set on
|
||||
large value. (David Carlier)
|
||||
. Fixed bug GH-15905 (Assertion failure for TRACK_VARS_SERVER). (cmb)
|
||||
|
||||
- Date:
|
||||
. Fixed bug GH-15582: Crash when not calling parent constructor of
|
||||
|
|
|
@ -897,6 +897,7 @@ static bool php_auto_globals_create_server(zend_string *name)
|
|||
} else {
|
||||
zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_SERVER]);
|
||||
array_init(&PG(http_globals)[TRACK_VARS_SERVER]);
|
||||
zend_hash_real_init_mixed(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]));
|
||||
}
|
||||
|
||||
check_http_proxy(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]));
|
||||
|
|
12
tests/basic/gh15905.phpt
Normal file
12
tests/basic/gh15905.phpt
Normal file
|
@ -0,0 +1,12 @@
|
|||
--TEST--
|
||||
GH-15905 (Assertion failure for TRACK_VARS_SERVER)
|
||||
--INI--
|
||||
variables_order=E
|
||||
auto_globals_jit=0
|
||||
register_argc_argv=1
|
||||
--FILE--
|
||||
<?php
|
||||
echo "okay\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
okay
|
Loading…
Add table
Add a link
Reference in a new issue