66#include <windows.h>
77#endif
88
9- static void clear_process_env (void ) {
9+ static void clear_process_env (lua_State * L ) {
1010#ifdef _WIN32
1111 LPCH env = GetEnvironmentStringsA ();
1212 if (!env ) return ;
@@ -19,11 +19,17 @@ static void clear_process_env(void) {
1919
2020 size_t len = (size_t )(eq - p );
2121
22- char key [len + 1 ];
22+ char * key = (char * )malloc (len + 1 );
23+ if (!key ) continue ;
2324 memcpy (key , p , len );
2425 key [len ] = '\0' ;
2526
2627 SetEnvironmentVariableA (key , NULL );
28+ // sync CRT
29+ if (_putenv_s (key , "" ) != 0 )
30+ luaL_error (L , "failed to sync CRT env (putenv)" );
31+
32+ free (key );
2733 }
2834 FreeEnvironmentStringsA (env );
2935#else
@@ -57,6 +63,9 @@ static int env_unset(lua_State *L, const char *key) {
5763#ifdef _WIN32
5864 if (!SetEnvironmentVariableA (key , NULL ))
5965 return luaL_error (L , "failed to unset env var" );
66+ // sync CRT
67+ if (_putenv_s (key , "" ) != 0 )
68+ return luaL_error (L , "failed to sync CRT env (putenv)" );
6069#else
6170 if (unsetenv (key ) != 0 )
6271 return luaL_error (L , "failed to unset env var" );
@@ -73,6 +82,9 @@ static int env_set(lua_State *L, const char *key, const char *val, const int for
7382 }
7483 if (!SetEnvironmentVariableA (key , val ))
7584 return luaL_error (L , "failed to set env var" );
85+ // sync CRT
86+ if (_putenv_s (key , val ) != 0 )
87+ return luaL_error (L , "failed to sync CRT env (putenv)" );
7688#else
7789 if (setenv (key , val , force ) != 0 )
7890 return luaL_error (L , "failed to set env var" );
@@ -201,11 +213,25 @@ static int env__newindex(lua_State *L) {
201213static int env__index (lua_State * L ) {
202214 lua_settop (L , 2 );
203215 const char * key = luaL_checkstring (L , 2 );
216+ #ifdef _WIN32
217+ DWORD size = GetEnvironmentVariableA (key , NULL , 0 );
218+ if (size == 0 ) {
219+ lua_pushnil (L );
220+ return 1 ;
221+ }
222+ char * buf = (char * )malloc (size );
223+ if (!buf ) return luaL_error (L , "out of memory" );
224+ GetEnvironmentVariableA (key , buf , size );
225+ lua_pushstring (L , buf );
226+ free (buf );
227+ #else
204228 const char * val = getenv (key );
205229 if (val )
206230 lua_pushstring (L , val );
207231 else
208232 lua_pushnil (L );
233+ #endif
234+
209235 return 1 ;
210236}
211237
@@ -221,7 +247,7 @@ static int env__call(lua_State *L) {
221247 // env(table)
222248 luaL_checktype (L , 2 , LUA_TTABLE );
223249
224- if (nargs > 2 && lua_toboolean (L , 3 )) clear_process_env ();
250+ if (nargs > 2 && lua_toboolean (L , 3 )) clear_process_env (L );
225251
226252 lua_pushnil (L );
227253 while (lua_next (L , 2 ) != 0 ) {
0 commit comments