if (!namebuf || !foundbuf)
{
RegCloseKey (hKey);
- if (namebuf)
- free (namebuf);
- if (foundbuf)
- free (foundbuf);
+ free (namebuf);
+ free (foundbuf);
return executable;
}
return tack_on_executable (buf, executable);
/* failed */
- if (buf)
- free (buf);
+ free (buf);
return executable;
}
#endif
si,
pi))
{
- if (env_block)
- free (env_block);
+ free (env_block);
free (full_executable);
/* Clean up. */
CloseHandle (pi->hThread);
free (full_executable);
- if (env_block)
- free (env_block);
+ free (env_block);
return (pid_t) pi->hProcess;
error:
- if (env_block)
- free (env_block);
- if (cmdline)
- free (cmdline);
- if (full_executable)
- free (full_executable);
+ free (env_block);
+ free (cmdline);
+ free (full_executable);
return (pid_t) -1;
}
int orig_out, orig_in, orig_err;
BOOL separate_stderr = !(flags & PEX_STDERR_TO_STDOUT);
- /* Ensure we have inheritable descriptors to pass to the child, and close the
- original descriptors. */
+ /* Ensure we have inheritable descriptors to pass to the child. */
orig_in = in;
in = _dup (orig_in);
- if (orig_in != STDIN_FILENO)
- _close (orig_in);
orig_out = out;
out = _dup (orig_out);
- if (orig_out != STDOUT_FILENO)
- _close (orig_out);
if (separate_stderr)
{
orig_err = errdes;
errdes = _dup (orig_err);
- if (orig_err != STDERR_FILENO)
- _close (orig_err);
}
stdin_handle = INVALID_HANDLE_VALUE;
*errmsg = "CreateProcess";
}
+ /* If the child was created successfully, close the original file
+ descriptors. If the process creation fails, these are closed by
+ pex_run_in_environment instead. We must not close them twice as
+ that seems to cause a Windows exception. */
+
+ if (pid != (pid_t) -1)
+ {
+ if (orig_in != STDIN_FILENO)
+ _close (orig_in);
+ if (orig_out != STDOUT_FILENO)
+ _close (orig_out);
+ if (separate_stderr
+ && orig_err != STDERR_FILENO)
+ _close (orig_err);
+ }
+
/* Close the standard input, standard output and standard error handles
in the parent. */