aboutsummaryrefslogtreecommitdiff
path: root/win32/env.c
diff options
context:
space:
mode:
Diffstat (limited to 'win32/env.c')
-rw-r--r--win32/env.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/win32/env.c b/win32/env.c
index 5de581e3d..4d4e9c8fd 100644
--- a/win32/env.c
+++ b/win32/env.c
@@ -78,7 +78,7 @@ int clearenv(void)
78 78
79int mingw_putenv(const char *env) 79int mingw_putenv(const char *env)
80{ 80{
81 char *s; 81 char *s, **envp;
82 int ret = 0; 82 int ret = 0;
83 83
84 if ( (s=strchr(env, '=')) == NULL ) { 84 if ( (s=strchr(env, '=')) == NULL ) {
@@ -90,13 +90,17 @@ int mingw_putenv(const char *env)
90 return _putenv(env); 90 return _putenv(env);
91 } 91 }
92 else { 92 else {
93 /* set empty value using WIN32 API*/ 93 /* set empty value by setting a non-empty one then truncating */
94 char *name = xstrdup(env); 94 char *envstr = xasprintf("%s0", env);
95 name[s - env] = '\0'; 95 ret = _putenv(envstr);
96 SetEnvironmentVariable(name, ""); 96
97 free(name); 97 for (envp = environ; *envp; ++envp) {
98 /* set a dummy variable to force CRT housekeeping */ 98 if (strcmp(*envp, envstr) == 0) {
99 _putenv("BB_DUMMY=0"); 99 (*envp)[s - env + 1] = '\0';
100 break;
101 }
102 }
103 free(envstr);
100 } 104 }
101 105
102 return ret; 106 return ret;