fix of issue 1290 (#358)
Fix processid assignment, memory leak and handle leaks on conpty session.
This commit is contained in:
parent
83bff88b24
commit
54b0ce9b56
|
@ -35,63 +35,6 @@
|
||||||
#include "misc_internal.h"
|
#include "misc_internal.h"
|
||||||
#include "signal_internal.h"
|
#include "signal_internal.h"
|
||||||
|
|
||||||
// Return Value: 0 for success, -1 for failure
|
|
||||||
int
|
|
||||||
CreateConPty(const wchar_t *cmdline,
|
|
||||||
const unsigned short width,
|
|
||||||
const unsigned short height,
|
|
||||||
HANDLE const hInput,
|
|
||||||
HANDLE const hOutput,
|
|
||||||
HANDLE const tty_sighandle,
|
|
||||||
PROCESS_INFORMATION* const piPty)
|
|
||||||
{
|
|
||||||
wchar_t system32_path[PATH_MAX] = { 0, };
|
|
||||||
|
|
||||||
SetHandleInformation(tty_sighandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
|
|
||||||
|
|
||||||
wchar_t conhostCmdline[8191] = { 0, }; // msdn
|
|
||||||
wchar_t *cmd_fmt = L"%ls\\conhost.exe --headless --width %d --height %d --signal 0x%x -- %ls";
|
|
||||||
|
|
||||||
if (!GetSystemDirectoryW(system32_path, PATH_MAX))
|
|
||||||
fatal("unable to retrieve system32 path");
|
|
||||||
|
|
||||||
_snwprintf_s(conhostCmdline,
|
|
||||||
_countof(conhostCmdline),
|
|
||||||
_countof(conhostCmdline),
|
|
||||||
cmd_fmt,
|
|
||||||
system32_path,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
tty_sighandle,
|
|
||||||
cmdline);
|
|
||||||
|
|
||||||
STARTUPINFOW si;
|
|
||||||
memset(&si, 0, sizeof(STARTUPINFOW));
|
|
||||||
si.cb = sizeof(STARTUPINFOW);
|
|
||||||
si.hStdInput = hInput;
|
|
||||||
si.hStdOutput = hOutput;
|
|
||||||
si.hStdError = hOutput;
|
|
||||||
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESIZE | STARTF_USECOUNTCHARS;
|
|
||||||
|
|
||||||
debug3("pty commandline: %ls", conhostCmdline);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* process CTRL+C input.
|
|
||||||
* Child processes will inherit this behavior.
|
|
||||||
*/
|
|
||||||
SetConsoleCtrlHandler(NULL, FALSE);
|
|
||||||
if (0 == CreateProcessW(NULL, conhostCmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, piPty)) {
|
|
||||||
debug("%s - failed to execute %ls, error:%d", __func__, conhostCmdline, GetLastError());
|
|
||||||
errno = EOTHER;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* disable Ctrl+C hander in this process*/
|
|
||||||
SetConsoleCtrlHandler(NULL, TRUE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
is_conpty_supported()
|
is_conpty_supported()
|
||||||
{
|
{
|
||||||
|
@ -140,33 +83,54 @@ int exec_command_with_pty(int * pid, char* cmd, int in, int out, int err, unsign
|
||||||
HANDLE ttyh = (HANDLE)w32_fd_to_handle(ttyfd);
|
HANDLE ttyh = (HANDLE)w32_fd_to_handle(ttyfd);
|
||||||
wchar_t * cmd_w = NULL;
|
wchar_t * cmd_w = NULL;
|
||||||
|
|
||||||
if ((cmd_w = utf8_to_utf16(cmd)) == NULL)
|
if ((cmd_w = utf8_to_utf16(cmd)) == NULL) {
|
||||||
|
errno = ENOMEM;
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&si, 0, sizeof(STARTUPINFO));
|
memset(&si, 0, sizeof(STARTUPINFO));
|
||||||
si.cb = sizeof(STARTUPINFO);
|
si.cb = sizeof(STARTUPINFO);
|
||||||
si.dwXCountChars = col;
|
|
||||||
si.dwYCountChars = row;
|
|
||||||
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESIZE | STARTF_USECOUNTCHARS;
|
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESIZE | STARTF_USECOUNTCHARS;
|
||||||
|
|
||||||
si.hStdInput = (HANDLE)w32_fd_to_handle(in);
|
si.hStdInput = (HANDLE)w32_fd_to_handle(in);
|
||||||
si.hStdOutput = (HANDLE)w32_fd_to_handle(out);
|
si.hStdOutput = (HANDLE)w32_fd_to_handle(out);
|
||||||
si.hStdError = (HANDLE)w32_fd_to_handle(err);
|
|
||||||
si.lpDesktop = NULL;
|
si.lpDesktop = NULL;
|
||||||
|
|
||||||
if (is_conpty_supported())
|
if (is_conpty_supported()) {
|
||||||
return CreateConPty(cmd_w, (short)si.dwXCountChars, (short)si.dwYCountChars, si.hStdInput, si.hStdOutput, ttyh, &pi);
|
wchar_t system32_path[PATH_MAX] = { 0, };
|
||||||
|
SetHandleInformation(ttyh, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
|
||||||
|
wchar_t *cmd_fmt = L"%ls\\conhost.exe --headless --width %d --height %d --signal 0x%x -- %ls";
|
||||||
|
|
||||||
/* launch via "ssh-shellhost" -p command*/
|
if (!GetSystemDirectoryW(system32_path, PATH_MAX))
|
||||||
|
fatal("unable to retrieve system32 path");
|
||||||
|
|
||||||
|
_snwprintf_s(pty_cmdline,
|
||||||
|
MAX_CMD_LEN,
|
||||||
|
MAX_CMD_LEN,
|
||||||
|
cmd_fmt,
|
||||||
|
system32_path,
|
||||||
|
col,
|
||||||
|
row,
|
||||||
|
ttyh,
|
||||||
|
cmd_w);
|
||||||
|
|
||||||
|
si.hStdError = si.hStdOutput;
|
||||||
|
/* process CTRL+C input. Child processes will inherit this behavior. */
|
||||||
|
SetConsoleCtrlHandler(NULL, FALSE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* launch via "ssh-shellhost" -p command*/
|
||||||
|
_snwprintf_s(pty_cmdline, MAX_CMD_LEN, MAX_CMD_LEN, L"\"%ls\\ssh-shellhost.exe\" ---pty %ls", __wprogdir, cmd_w);
|
||||||
|
si.dwXCountChars = col;
|
||||||
|
si.dwYCountChars = row;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In PTY mode, ssh-shellhost takes stderr as control channel
|
||||||
|
* TODO - fix this and pass control channel pipe as a command line parameter
|
||||||
|
*/
|
||||||
|
si.hStdError = ttyh;
|
||||||
|
}
|
||||||
|
|
||||||
_snwprintf_s(pty_cmdline, MAX_CMD_LEN, MAX_CMD_LEN, L"\"%ls\\ssh-shellhost.exe\" ---pty %ls", __wprogdir, cmd_w);
|
|
||||||
/*
|
|
||||||
* In PTY mode, ssh-shellhost takes stderr as control channel
|
|
||||||
* TODO - fix this and pass control channel pipe as a command line parameter
|
|
||||||
*/
|
|
||||||
si.hStdError = ttyh;
|
|
||||||
debug3("pty commandline: %ls", pty_cmdline);
|
debug3("pty commandline: %ls", pty_cmdline);
|
||||||
|
|
||||||
if (CreateProcessW(NULL, pty_cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
|
if (CreateProcessW(NULL, pty_cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
|
||||||
if (register_child(pi.hProcess, pi.dwProcessId) == -1) {
|
if (register_child(pi.hProcess, pi.dwProcessId) == -1) {
|
||||||
TerminateProcess(pi.hProcess, 0);
|
TerminateProcess(pi.hProcess, 0);
|
||||||
|
@ -184,6 +148,8 @@ int exec_command_with_pty(int * pid, char* cmd, int in, int out, int err, unsign
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
/* disable Ctrl+C hander in this process*/
|
||||||
|
SetConsoleCtrlHandler(NULL, TRUE);
|
||||||
if (cmd_w)
|
if (cmd_w)
|
||||||
free(cmd_w);
|
free(cmd_w);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue