diff --git a/NEWS b/NEWS index e09d6129c66..4b5d96f48e5 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ PHP NEWS - Core: . Fixed bug #81430 (Attribute instantiation leaves dangling pointer). (beberlei) + . Fixed bug GH-7896 (Environment vars may be mangled on Windows). (cmb) - FFI: . Fixed bug GH-7867 (FFI::cast() from pointer to array is broken). (cmb, diff --git a/main/php_variables.c b/main/php_variables.c index 312c22ef07d..6a8ff5e1f09 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -571,11 +571,15 @@ void _php_import_environment_variables(zval *array_ptr) 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); + wchar_t *environmentw = GetEnvironmentStringsW(); + for (wchar_t *envw = environmentw; envw != NULL && *envw; envw += wcslen(envw) + 1) { + char *env = php_win32_cp_w_to_any(envw); + if (env != NULL) { + import_environment_variable(Z_ARRVAL_P(array_ptr), env); + free(env); + } } - FreeEnvironmentStringsA(environment); + FreeEnvironmentStringsW(environmentw); #endif tsrm_env_unlock(); diff --git a/tests/basic/gh7896.phpt b/tests/basic/gh7896.phpt new file mode 100644 index 00000000000..2ad2958d1cd --- /dev/null +++ b/tests/basic/gh7896.phpt @@ -0,0 +1,20 @@ +--TEST-- +GH-7896 (Environment vars may be mangled on Windows) +--SKIPIF-- + +--ENV-- +FÖÖ=GüИter传 +--FILE-- + +--EXPECT-- +string(11) "GüИter传" +string(11) "GüИter传" +string(11) "GüИter传"