summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-02-11 11:50:42 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-02-11 11:57:57 +0100
commit93b183ed551999e8c3f80cff1cc40c2be5f33033 (patch)
tree663858649d56736e41522744f63af8958a4371b4 /main
parent038ca4bb07abc87f5030c0257fe81876799e22b4 (diff)
parent7b464ce6f3feb94dc5b897e4f8792a39e07710b6 (diff)
downloadphp-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')
-rw-r--r--main/php_variables.c67
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();
}