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