mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-07-30 09:14:59 +02:00
Some updates on shell-host.c (#210)
PowerShell/Win32-OpenSSH#893 Create pipe using default buffer size Update buffer size when read and write file change to use _wcsnicmp printed out error when create pipe added release of the memory
This commit is contained in:
parent
8747626b6a
commit
afb81c082d
@ -102,7 +102,7 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PrecompiledHeader>
|
<PrecompiledHeader>
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level1</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_WIN32_WINNT=0x600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_WIN32_WINNT=0x600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>false</SDLCheck>
|
<SDLCheck>false</SDLCheck>
|
||||||
@ -142,7 +142,7 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level1</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<PrecompiledHeader>
|
<PrecompiledHeader>
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
#define MAX_CMD_LEN 8191 // msdn
|
#define MAX_CMD_LEN 8191 // msdn
|
||||||
#define WM_APPEXIT WM_USER+1
|
#define WM_APPEXIT WM_USER+1
|
||||||
#define MAX_EXPECTED_BUFFER_SIZE 1024
|
#define MAX_EXPECTED_BUFFER_SIZE 1024
|
||||||
|
/* 4KB is the largest size for which writes are guaranteed to be atomic */
|
||||||
|
#define BUFF_SIZE 4096
|
||||||
|
|
||||||
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
||||||
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x4
|
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x4
|
||||||
@ -1218,7 +1220,7 @@ start_with_pty(wchar_t *command)
|
|||||||
HMODULE hm_kernel32 = NULL, hm_user32 = NULL;
|
HMODULE hm_kernel32 = NULL, hm_user32 = NULL;
|
||||||
wchar_t kernel32_dll_path[PATH_MAX]={0,}, user32_dll_path[PATH_MAX]={0,};
|
wchar_t kernel32_dll_path[PATH_MAX]={0,}, user32_dll_path[PATH_MAX]={0,};
|
||||||
|
|
||||||
if(cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
printf_s("ssh-shellhost is out of memory");
|
printf_s("ssh-shellhost is out of memory");
|
||||||
exit(255);
|
exit(255);
|
||||||
}
|
}
|
||||||
@ -1278,11 +1280,9 @@ start_with_pty(wchar_t *command)
|
|||||||
GOTO_CLEANUP_ON_FALSE(SetHandleInformation(pipe_in, HANDLE_FLAG_INHERIT, 0));
|
GOTO_CLEANUP_ON_FALSE(SetHandleInformation(pipe_in, HANDLE_FLAG_INHERIT, 0));
|
||||||
|
|
||||||
cmd[0] = L'\0';
|
cmd[0] = L'\0';
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, w32_cmd_path()));
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, w32_cmd_path()));
|
||||||
|
|
||||||
if (command) {
|
if (command) {
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, L" /c"));
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, L" /c "));
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, L" "));
|
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, command));
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, command));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1373,18 +1373,17 @@ start_withno_pty(wchar_t *command)
|
|||||||
{
|
{
|
||||||
STARTUPINFO si;
|
STARTUPINFO si;
|
||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
wchar_t *cmd = (wchar_t *) malloc(sizeof(wchar_t) * MAX_CMD_LEN);
|
wchar_t *cmd = (wchar_t *)malloc(sizeof(wchar_t) * MAX_CMD_LEN);
|
||||||
SECURITY_ATTRIBUTES sa;
|
SECURITY_ATTRIBUTES sa;
|
||||||
BOOL ret, process_input = FALSE, run_under_cmd = FALSE;
|
BOOL ret, process_input = FALSE, run_under_cmd = FALSE;
|
||||||
size_t command_len;
|
size_t command_len;
|
||||||
char buf[128];
|
char *buf = (char *)malloc(BUFF_SIZE + 1);
|
||||||
DWORD rd = 0, wr = 0, i = 0;
|
DWORD rd = 0, wr = 0, i = 0;
|
||||||
|
|
||||||
if (cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
printf_s("ssh-shellhost is out of memory");
|
printf_s("ssh-shellhost is out of memory");
|
||||||
exit(255);
|
exit(255);
|
||||||
}
|
}
|
||||||
|
|
||||||
pipe_in = GetStdHandle(STD_INPUT_HANDLE);
|
pipe_in = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
pipe_out = GetStdHandle(STD_OUTPUT_HANDLE);
|
pipe_out = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
pipe_err = GetStdHandle(STD_ERROR_HANDLE);
|
pipe_err = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
@ -1395,8 +1394,11 @@ start_withno_pty(wchar_t *command)
|
|||||||
|
|
||||||
memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
|
memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
|
||||||
sa.bInheritHandle = TRUE;
|
sa.bInheritHandle = TRUE;
|
||||||
if (!CreatePipe(&child_pipe_read, &child_pipe_write, &sa, 128))
|
/* use the default buffer size, 64K*/
|
||||||
|
if (!CreatePipe(&child_pipe_read, &child_pipe_write, &sa, 0)) {
|
||||||
|
printf_s("ssh-shellhost-can't open no pty session, error: %d", GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&si, 0, sizeof(STARTUPINFO));
|
memset(&si, 0, sizeof(STARTUPINFO));
|
||||||
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
|
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
|
||||||
@ -1428,10 +1430,10 @@ start_withno_pty(wchar_t *command)
|
|||||||
process_input = TRUE;
|
process_input = TRUE;
|
||||||
else {
|
else {
|
||||||
command_len = wcsnlen_s(command, MAX_CMD_LEN);
|
command_len = wcsnlen_s(command, MAX_CMD_LEN);
|
||||||
if ((command_len >= 3 && wcsncmp(command, L"cmd", 4) == 0) ||
|
if ((command_len >= 3 && _wcsnicmp(command, L"cmd", 4) == 0) ||
|
||||||
(command_len >= 7 && wcsncmp(command, L"cmd.exe", 8) == 0) ||
|
(command_len >= 7 && _wcsnicmp(command, L"cmd.exe", 8) == 0) ||
|
||||||
(command_len >= 4 && wcsncmp(command, L"cmd ", 4) == 0) ||
|
(command_len >= 4 && _wcsnicmp(command, L"cmd ", 4) == 0) ||
|
||||||
(command_len >= 8 && wcsncmp(command, L"cmd.exe ", 8) == 0))
|
(command_len >= 8 && _wcsnicmp(command, L"cmd.exe ", 8) == 0))
|
||||||
process_input = TRUE;
|
process_input = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1450,12 +1452,11 @@ start_withno_pty(wchar_t *command)
|
|||||||
run_under_cmd = TRUE;
|
run_under_cmd = TRUE;
|
||||||
|
|
||||||
/* if above failed with FILE_NOT_FOUND, try running the provided command under cmd*/
|
/* if above failed with FILE_NOT_FOUND, try running the provided command under cmd*/
|
||||||
if (run_under_cmd) {
|
if (run_under_cmd) {
|
||||||
cmd[0] = L'\0';
|
cmd[0] = L'\0';
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, w32_cmd_path()));
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, w32_cmd_path()));
|
||||||
if (command) {
|
if (command) {
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, L" /c"));
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, L" /c "));
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, L" "));
|
|
||||||
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, command));
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_CMD_LEN, command));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1476,10 +1477,15 @@ start_withno_pty(wchar_t *command)
|
|||||||
/* disable Ctrl+C hander in this process*/
|
/* disable Ctrl+C hander in this process*/
|
||||||
SetConsoleCtrlHandler(NULL, TRUE);
|
SetConsoleCtrlHandler(NULL, TRUE);
|
||||||
|
|
||||||
|
if (buf == NULL) {
|
||||||
|
printf_s("ssh-shellhost is out of memory");
|
||||||
|
exit(255);
|
||||||
|
}
|
||||||
/* process data from pipe_in and route appropriately */
|
/* process data from pipe_in and route appropriately */
|
||||||
while (1) {
|
while (1) {
|
||||||
rd = wr = i = 0;
|
rd = wr = i = 0;
|
||||||
GOTO_CLEANUP_ON_FALSE(ReadFile(pipe_in, buf, sizeof(buf)-1, &rd, NULL));
|
buf[0] = L'\0';
|
||||||
|
GOTO_CLEANUP_ON_FALSE(ReadFile(pipe_in, buf, BUFF_SIZE, &rd, NULL));
|
||||||
|
|
||||||
if (process_input == FALSE) {
|
if (process_input == FALSE) {
|
||||||
/* write stream directly to child stdin */
|
/* write stream directly to child stdin */
|
||||||
@ -1521,12 +1527,10 @@ start_withno_pty(wchar_t *command)
|
|||||||
|
|
||||||
/* For CR and LF */
|
/* For CR and LF */
|
||||||
if ((buf[i] == '\r') || (buf[i] == '\n')) {
|
if ((buf[i] == '\r') || (buf[i] == '\n')) {
|
||||||
/* TODO - do a much accurate mapping */
|
/* TODO - do a much accurate mapping */
|
||||||
GOTO_CLEANUP_ON_FALSE(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
if ((buf[i] == '\r') && ((i == rd - 1) || (buf[i + 1] != '\n')))
|
||||||
if ((buf[i] == '\r') && ((i == rd - 1) || (buf[i + 1] != '\n'))) {
|
|
||||||
buf[i] = '\n';
|
buf[i] = '\n';
|
||||||
GOTO_CLEANUP_ON_FALSE(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
||||||
}
|
|
||||||
in_cmd[in_cmd_len] = buf[i];
|
in_cmd[in_cmd_len] = buf[i];
|
||||||
in_cmd_len++;
|
in_cmd_len++;
|
||||||
GOTO_CLEANUP_ON_FALSE(WriteFile(child_pipe_write, in_cmd, in_cmd_len, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(child_pipe_write, in_cmd, in_cmd_len, &wr, NULL));
|
||||||
@ -1557,6 +1561,12 @@ cleanup:
|
|||||||
}
|
}
|
||||||
if (!IS_INVALID_HANDLE(child))
|
if (!IS_INVALID_HANDLE(child))
|
||||||
TerminateProcess(child, 0);
|
TerminateProcess(child, 0);
|
||||||
|
|
||||||
|
if (buf != NULL)
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
if (cmd != NULL)
|
||||||
|
free(cmd);
|
||||||
|
|
||||||
return child_exit_code;
|
return child_exit_code;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user