fix for FD_SET call on pipes and handling of channel EOF

pull/776/head
JacobBarthelmeh 2025-02-17 10:07:39 -07:00
parent 697f54a7e5
commit ab3622e672
1 changed files with 35 additions and 18 deletions

View File

@ -816,7 +816,8 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
BOOL ret;
word32 shellChannelId = 0;
#ifndef EXAMPLE_BUFFER_SZ
#define EXAMPLE_BUFFER_SZ 4096
/* default to try and read max packet size */
#define EXAMPLE_BUFFER_SZ 32768
#endif
byte shellBuffer[EXAMPLE_BUFFER_SZ];
int cnt_r, cnt_w;
@ -1166,7 +1167,8 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
pid_t childPid;
#ifndef EXAMPLE_BUFFER_SZ
#define EXAMPLE_BUFFER_SZ 4096
/* default to try and read max packet size */
#define EXAMPLE_BUFFER_SZ 32768
#endif
#ifndef MAX_IDLE_COUNT
#define MAX_IDLE_COUNT 2
@ -1431,6 +1433,7 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
FD_SET(sshFd, &writeFds);
}
if (wolfSSH_stream_peek(ssh, tmp, 1) <= 0) {
/* select on stdout/stderr pipes with forced commands */
if (forcedCmd) {
FD_SET(stdoutPipe[0], &readFds);
@ -1447,7 +1450,6 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
maxFd = childFd;
}
if (wolfSSH_stream_peek(ssh, tmp, 1) <= 0) {
rc = select((int)maxFd + 1, &readFds, &writeFds, NULL, NULL);
if (rc == -1)
break;
@ -1503,6 +1505,21 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
break;
}
}
/* did the channel just receive an EOF? */
if (cnt_r == 0) {
int eof;
WOLFSSH_CHANNEL* current;
current = wolfSSH_ChannelFind(ssh, lastChannel,
WS_CHANNEL_ID_SELF);
eof = wolfSSH_ChannelGetEof(current);
if (eof) {
/* SSH is done, kill off child process */
kill(childPid, SIGKILL);
break;
}
}
}
/* if the window was previously full, try resending the data */