aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--win32/env.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/win32/env.c b/win32/env.c
index a7ab7851a..4d4e9c8fd 100644
--- a/win32/env.c
+++ b/win32/env.c
@@ -78,16 +78,30 @@ 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 83
83 if ( (s=strchr(env, '=')) == NULL ) { 84 if ( (s=strchr(env, '=')) == NULL ) {
84 return unsetenv(env); 85 return unsetenv(env);
85 } 86 }
86 87
87 if ( s[1] != '\0' ) { 88 if (s[1] != '\0') {
89 /* setting non-empty value is fine */
88 return _putenv(env); 90 return _putenv(env);
89 } 91 }
92 else {
93 /* set empty value by setting a non-empty one then truncating */
94 char *envstr = xasprintf("%s0", env);
95 ret = _putenv(envstr);
96
97 for (envp = environ; *envp; ++envp) {
98 if (strcmp(*envp, envstr) == 0) {
99 (*envp)[s - env + 1] = '\0';
100 break;
101 }
102 }
103 free(envstr);
104 }
90 105
91 /* can't set empty value */ 106 return ret;
92 return 0;
93} 107}