diff options
-rw-r--r-- | win32/env.c | 22 |
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 | ||
79 | int mingw_putenv(const char *env) | 79 | int 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 | } |