Skip to content

Commit

Permalink
add check for full window with SSHD and improve nonblocking connect w…
Browse files Browse the repository at this point in the history
…ith client
  • Loading branch information
JacobBarthelmeh committed Aug 7, 2023
1 parent e089f2d commit 067cc06
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
22 changes: 20 additions & 2 deletions apps/wolfsshd/wolfsshd.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,7 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
byte shellBuffer[EXAMPLE_BUFFER_SZ];
byte channelBuffer[EXAMPLE_BUFFER_SZ];
char* forcedCmd;
int windowFull = 0;

forcedCmd = wolfSSHD_ConfigGetForcedCmd(usrConf);

Expand Down Expand Up @@ -876,7 +877,7 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
pending = 1; /* found some pending SSH data */
}

if (pending || FD_ISSET(sshFd, &readFds)) {
if (windowFull || pending || FD_ISSET(sshFd, &readFds)) {
word32 lastChannel = 0;

/* The following tries to read from the first channel inside
Expand Down Expand Up @@ -910,6 +911,19 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
}
}

/* if the window was previously full, try resending the data */
if (windowFull) {
cnt_w = wolfSSH_ChannelIdSend(ssh, shellChannelId,
shellBuffer, cnt_r);
if (cnt_w == WS_WINDOW_FULL) {
windowFull = 1;
continue;
}
else {
windowFull = 0;
}
}

if (FD_ISSET(childFd, &readFds)) {
cnt_r = (int)read(childFd, shellBuffer, sizeof shellBuffer);
/* This read will return 0 on EOF */
Expand All @@ -923,7 +937,11 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
if (cnt_r > 0) {
cnt_w = wolfSSH_ChannelIdSend(ssh, shellChannelId,
shellBuffer, cnt_r);
if (cnt_w < 0)
if (cnt_w == WS_WINDOW_FULL) {
windowFull = 1;
continue;
}
else if (cnt_w < 0)
break;
}
}
Expand Down
8 changes: 7 additions & 1 deletion examples/client/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,13 @@ static int NonBlockSSH_connect(WOLFSSH* ssh)
printf("... client would write block\n");

select_ret = tcp_select(sockfd, 1);
if (select_ret == WS_SELECT_RECV_READY ||

/* Continue in want write cases even if did not select on socket
* because there could be pending data to be written. Added continue
* on want write for test cases where a forced want read was introduced
* and the socket will not be receiving more data. */
if (error == WS_WANT_WRITE || error == WS_WANT_READ ||
select_ret == WS_SELECT_RECV_READY ||
select_ret == WS_SELECT_ERROR_READY)
{
ret = wolfSSH_connect(ssh);
Expand Down

0 comments on commit 067cc06

Please sign in to comment.