diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-02-11 11:50:42 +0100 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-02-11 11:57:57 +0100 |
commit | 93b183ed551999e8c3f80cff1cc40c2be5f33033 (patch) | |
tree | 663858649d56736e41522744f63af8958a4371b4 /main/php_variables.c | |
parent | 038ca4bb07abc87f5030c0257fe81876799e22b4 (diff) | |
parent | 7b464ce6f3feb94dc5b897e4f8792a39e07710b6 (diff) | |
download | php-git-93b183ed551999e8c3f80cff1cc40c2be5f33033.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3:
Fix #79254: getenv() w/o arguments not showing changes
Diffstat (limited to 'main/php_variables.c')
-rw-r--r-- | main/php_variables.c | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/main/php_variables.c b/main/php_variables.c index 74fea2c848..1a40c2a19f 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -540,39 +540,58 @@ 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) +{ +#ifndef PHP_WIN32 + char **env; +#else + char *environment, *env; +#endif + tsrm_env_lock(); +#ifndef PHP_WIN32 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)); - } + import_environment_variable(Z_ARRVAL_P(array_ptr), *env); } +#else + environment = GetEnvironmentStringsA(); + for (env = environment; env != NULL && *env; env += strlen(env) + 1) { + import_environment_variable(Z_ARRVAL_P(array_ptr), env); + } + FreeEnvironmentStringsA(environment); +#endif tsrm_env_unlock(); } |