mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #79254: getenv() w/o arguments not showing changes
This commit is contained in:
22
ext/standard/tests/general_functions/bug79254.phpt
Normal file
22
ext/standard/tests/general_functions/bug79254.phpt
Normal file
@@ -0,0 +1,22 @@
|
||||
--TEST--
|
||||
Bug #79254 (getenv() w/o arguments not showing changes)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$old = getenv();
|
||||
var_dump(getenv("PHP_BUG_79254", true));
|
||||
|
||||
putenv("PHP_BUG_79254=BAR");
|
||||
|
||||
$new = getenv();
|
||||
var_dump(array_diff($new, $old));
|
||||
var_dump(getenv("PHP_BUG_79254", true));
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(false)
|
||||
array(1) {
|
||||
["PHP_BUG_79254"]=>
|
||||
string(3) "BAR"
|
||||
}
|
||||
string(3) "BAR"
|
||||
@@ -538,39 +538,52 @@ static zend_always_inline int valid_environment_name(const char *name, const cha
|
||||
return 1;
|
||||
}
|
||||
|
||||
void _php_import_environment_variables(zval *array_ptr)
|
||||
static zend_always_inline void import_environment_variable(HashTable *ht, char *env)
|
||||
{
|
||||
char **env, *p;
|
||||
char *p;
|
||||
size_t name_len, len;
|
||||
zval val;
|
||||
zend_ulong idx;
|
||||
|
||||
p = strchr(env, '=');
|
||||
if (!p
|
||||
|| p == env
|
||||
|| !valid_environment_name(env, p)) {
|
||||
/* malformed entry? */
|
||||
return;
|
||||
}
|
||||
name_len = p - env;
|
||||
p++;
|
||||
len = strlen(p);
|
||||
if (len == 0) {
|
||||
ZVAL_EMPTY_STRING(&val);
|
||||
} else if (len == 1) {
|
||||
ZVAL_INTERNED_STR(&val, ZSTR_CHAR((zend_uchar)*p));
|
||||
} else {
|
||||
ZVAL_NEW_STR(&val, zend_string_init(p, len, 0));
|
||||
}
|
||||
if (ZEND_HANDLE_NUMERIC_STR(env, name_len, idx)) {
|
||||
zend_hash_index_update(ht, idx, &val);
|
||||
} else {
|
||||
php_register_variable_quick(env, name_len, &val, ht);
|
||||
}
|
||||
}
|
||||
|
||||
void _php_import_environment_variables(zval *array_ptr)
|
||||
{
|
||||
tsrm_env_lock();
|
||||
|
||||
for (env = environ; env != NULL && *env != NULL; env++) {
|
||||
p = strchr(*env, '=');
|
||||
if (!p
|
||||
|| p == *env
|
||||
|| !valid_environment_name(*env, p)) {
|
||||
/* malformed entry? */
|
||||
continue;
|
||||
}
|
||||
name_len = p - *env;
|
||||
p++;
|
||||
len = strlen(p);
|
||||
if (len == 0) {
|
||||
ZVAL_EMPTY_STRING(&val);
|
||||
} else if (len == 1) {
|
||||
ZVAL_INTERNED_STR(&val, ZSTR_CHAR((zend_uchar)*p));
|
||||
} else {
|
||||
ZVAL_NEW_STR(&val, zend_string_init(p, len, 0));
|
||||
}
|
||||
if (ZEND_HANDLE_NUMERIC_STR(*env, name_len, idx)) {
|
||||
zend_hash_index_update(Z_ARRVAL_P(array_ptr), idx, &val);
|
||||
} else {
|
||||
php_register_variable_quick(*env, name_len, &val, Z_ARRVAL_P(array_ptr));
|
||||
}
|
||||
#ifndef PHP_WIN32
|
||||
for (char **env = environ; env != NULL && *env != NULL; env++) {
|
||||
import_environment_variable(Z_ARRVAL_P(array_ptr), *env);
|
||||
}
|
||||
#else
|
||||
char *environment = GetEnvironmentStringsA();
|
||||
for (char *env = environment; env != NULL && *env; env += strlen(env) + 1) {
|
||||
import_environment_variable(Z_ARRVAL_P(array_ptr), env);
|
||||
}
|
||||
FreeEnvironmentStringsA(environment);
|
||||
#endif
|
||||
|
||||
tsrm_env_unlock();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user