aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2016-10-09 09:17:08 +1000
committerSteve Bennett <steveb@workware.net.au>2016-10-09 09:30:47 +1000
commitf5e2c517999777060b8dfc1baf38c67cac5702e7 (patch)
tree76bf8ab3608374cf37750c46939e7200007cceb7
parent41c5ff1809f5d84569c3f435afc2db38f768791c (diff)
downloadjimtcl-f5e2c517999777060b8dfc1baf38c67cac5702e7.zip
jimtcl-f5e2c517999777060b8dfc1baf38c67cac5702e7.tar.gz
jimtcl-f5e2c517999777060b8dfc1baf38c67cac5702e7.tar.bz2
exec: Fix windows exec with empty or unset env
Reported-by: Evan Hunter <evan@ozhiker.com> Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-exec.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/jim-exec.c b/jim-exec.c
index 6690c75..9059ca2 100644
--- a/jim-exec.c
+++ b/jim-exec.c
@@ -121,7 +121,7 @@ int Jim_execInit(Jim_Interp *interp)
static fdtype JimOpenForRead(const char *filename);
static FILE *JimFdOpenForRead(fdtype fd);
static int JimPipe(fdtype pipefd[2]);
- static pidtype JimStartWinProcess(Jim_Interp *interp, char **argv, char *env,
+ static pidtype JimStartWinProcess(Jim_Interp *interp, char **argv, char **env,
fdtype inputId, fdtype outputId, fdtype errorId);
static int JimErrno(void);
#else
@@ -151,6 +151,7 @@ int Jim_execInit(Jim_Interp *interp)
#endif
static const char *JimStrError(void);
+static char **JimOriginalEnviron(void);
static char **JimSaveEnv(char **env);
static void JimRestoreEnv(char **env);
static int JimCreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv,
@@ -235,7 +236,7 @@ static char **JimBuildEnv(Jim_Interp *interp)
Jim_Obj *objPtr = Jim_GetGlobalVariableStr(interp, "env", JIM_NONE);
if (!objPtr) {
- return Jim_GetEnviron();
+ return JimOriginalEnviron();
}
/* We build the array as a single block consisting of the pointers followed by
@@ -986,7 +987,7 @@ badargs:
/* Now fork the child */
#ifdef __MINGW32__
- pid = JimStartWinProcess(interp, &arg_array[firstArg], save_environ ? save_environ[0] : NULL, inputId, outputId, errorId);
+ pid = JimStartWinProcess(interp, &arg_array[firstArg], save_environ, inputId, outputId, errorId);
if (pid == JIM_BAD_PID) {
Jim_SetResultFormatted(interp, "couldn't exec \"%s\"", arg_array[firstArg]);
goto error;
@@ -1435,6 +1436,11 @@ static void JimRestoreEnv(char **env)
JimFreeEnv(env, Jim_GetEnviron());
}
+static char **JimOriginalEnviron(void)
+{
+ return NULL;
+}
+
static Jim_Obj *
JimWinBuildCommandLine(Jim_Interp *interp, char **argv)
{
@@ -1512,7 +1518,7 @@ JimWinBuildCommandLine(Jim_Interp *interp, char **argv)
}
static pidtype
-JimStartWinProcess(Jim_Interp *interp, char **argv, char *env, fdtype inputId, fdtype outputId, fdtype errorId)
+JimStartWinProcess(Jim_Interp *interp, char **argv, char **env, fdtype inputId, fdtype outputId, fdtype errorId)
{
STARTUPINFO startInfo;
PROCESS_INFORMATION procInfo;
@@ -1520,6 +1526,7 @@ JimStartWinProcess(Jim_Interp *interp, char **argv, char *env, fdtype inputId, f
char execPath[MAX_PATH];
pidtype pid = JIM_BAD_PID;
Jim_Obj *cmdLineObj;
+ char *winenv;
if (JimWinFindExecutable(argv[0], execPath) < 0) {
return JIM_BAD_PID;
@@ -1586,8 +1593,23 @@ JimStartWinProcess(Jim_Interp *interp, char **argv, char *env, fdtype inputId, f
goto end;
}
+ /* If env is NULL, use the original environment.
+ * If env[0] is NULL, use an empty environment.
+ * Otherwise use the environment starting at env[0]
+ */
+ if (env == NULL) {
+ /* Use the original environment */
+ winenv = NULL;
+ }
+ else if (env[0] == NULL) {
+ winenv = (char *)"\0";
+ }
+ else {
+ winenv = env[0];
+ }
+
if (!CreateProcess(NULL, (char *)Jim_String(cmdLineObj), NULL, NULL, TRUE,
- 0, env, NULL, &startInfo, &procInfo)) {
+ 0, winenv, NULL, &startInfo, &procInfo)) {
goto end;
}
@@ -1648,6 +1670,11 @@ static int JimCreateTemp(Jim_Interp *interp, const char *contents, int len)
return fd;
}
+static char **JimOriginalEnviron(void)
+{
+ return Jim_GetEnviron();
+}
+
static char **JimSaveEnv(char **env)
{
char **saveenv = Jim_GetEnviron();