mirror of https://github.com/wolfSSL/wolfssh.git
add non blocking testing and better support for non blocking edge cases
parent
0cefa074fb
commit
b8ae2fab59
|
@ -753,6 +753,12 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
}
|
||||
myoptind = 0; /* reset for test cases */
|
||||
|
||||
#ifdef WOLFSSH_TEST_BLOCK
|
||||
if (!nonBlock) {
|
||||
err_sys("Use -N when testing forced non blocking");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (wolfSSH_Init() != WS_SUCCESS) {
|
||||
fprintf(stderr, "Couldn't initialize wolfSSH.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
|
|
|
@ -937,6 +937,13 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
|
|||
if (username == NULL)
|
||||
err_sys("client requires a username parameter.");
|
||||
|
||||
|
||||
#ifdef WOLFSSH_TEST_BLOCK
|
||||
if (!nonBlock) {
|
||||
err_sys("Use -N when testing forced non blocking");
|
||||
}
|
||||
#endif
|
||||
|
||||
ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);
|
||||
if (ctx == NULL)
|
||||
err_sys("Couldn't create wolfSSH client context.");
|
||||
|
|
26
src/io.c
26
src/io.c
|
@ -38,6 +38,16 @@
|
|||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSH_TEST_BLOCK
|
||||
#define WOLFSSH_TEST_SERVER
|
||||
#include "wolfssh/test.h"
|
||||
|
||||
/* percent of time that forced want read/write is done */
|
||||
#ifndef WOLFSSH_BLOCK_PROB
|
||||
#define WOLFSSH_BLOCK_PROB 75
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* allow I/O callback handlers whether user I/O or not */
|
||||
|
||||
|
@ -300,7 +310,6 @@ static INLINE int LastError(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* The receive embedded callback
|
||||
* return : nb bytes read, or error
|
||||
*/
|
||||
|
@ -311,6 +320,14 @@ int wsEmbedRecv(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
|
|||
int sd = *(int*)ctx;
|
||||
char* buf = (char*)data;
|
||||
|
||||
#ifdef WOLFSSH_TEST_BLOCK
|
||||
if (tcp_select(sd, 1) == WS_SELECT_RECV_READY &&
|
||||
(rand() % 100) < WOLFSSH_BLOCK_PROB) {
|
||||
printf("Forced read block\n");
|
||||
return WS_CBIO_ERR_WANT_READ;
|
||||
}
|
||||
#endif
|
||||
|
||||
recvd = (int)RECV_FUNCTION(sd, buf, sz, ssh->rflags);
|
||||
|
||||
recvd = TranslateReturnCode(recvd, sd);
|
||||
|
@ -363,6 +380,13 @@ int wsEmbedSend(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
|
|||
int err;
|
||||
char* buf = (char*)data;
|
||||
|
||||
#ifdef WOLFSSH_TEST_BLOCK
|
||||
if ((rand() % 100) < WOLFSSH_BLOCK_PROB) {
|
||||
printf("Forced write block\n");
|
||||
return WS_CBIO_ERR_WANT_WRITE;
|
||||
}
|
||||
#endif
|
||||
|
||||
WLOG(WS_LOG_DEBUG,"Embed Send trying to send %d", sz);
|
||||
|
||||
#ifdef MICROCHIP_MPLAB_HARMONY
|
||||
|
|
17
src/ssh.c
17
src/ssh.c
|
@ -277,7 +277,8 @@ int wolfSSH_accept(WOLFSSH* ssh)
|
|||
if (ssh->acceptState != ACCEPT_SERVER_VERSION_SENT &&
|
||||
ssh->acceptState != ACCEPT_SERVER_USERAUTH_ACCEPT_SENT &&
|
||||
ssh->acceptState != ACCEPT_SERVER_KEXINIT_SENT &&
|
||||
ssh->acceptState != ACCEPT_KEYED) {
|
||||
ssh->acceptState != ACCEPT_KEYED &&
|
||||
ssh->acceptState != ACCEPT_SERVER_CHANNEL_ACCEPT_SENT) {
|
||||
WLOG(WS_LOG_DEBUG, "Advancing accept state");
|
||||
ssh->acceptState++;
|
||||
}
|
||||
|
@ -439,8 +440,6 @@ int wolfSSH_accept(WOLFSSH* ssh)
|
|||
continue;
|
||||
}
|
||||
#endif
|
||||
ssh->acceptState = ACCEPT_CLIENT_SESSION_ESTABLISHED;
|
||||
WLOG(WS_LOG_DEBUG, acceptState, "CLIENT_SESSION_ESTABLISHED");
|
||||
#if defined(WOLFSSH_SFTP) && !defined(NO_WOLFSSH_SERVER)
|
||||
{
|
||||
const char* cmd = wolfSSH_GetSessionCommand(ssh);
|
||||
|
@ -452,6 +451,8 @@ int wolfSSH_accept(WOLFSSH* ssh)
|
|||
}
|
||||
}
|
||||
#endif /* WOLFSSH_SFTP and !NO_WOLFSSH_SERVER */
|
||||
ssh->acceptState = ACCEPT_CLIENT_SESSION_ESTABLISHED;
|
||||
WLOG(WS_LOG_DEBUG, acceptState, "CLIENT_SESSION_ESTABLISHED");
|
||||
break;
|
||||
|
||||
#ifdef WOLFSSH_SCP
|
||||
|
@ -505,7 +506,6 @@ int wolfSSH_connect(WOLFSSH* ssh)
|
|||
ssh->connectState != CONNECT_CLIENT_CHANNEL_OPEN_SESSION_SENT &&
|
||||
ssh->connectState != CONNECT_CLIENT_CHANNEL_REQUEST_SENT) {
|
||||
WLOG(WS_LOG_DEBUG, "Advancing connect state");
|
||||
printf("advance connect state\n");
|
||||
ssh->connectState++;
|
||||
}
|
||||
|
||||
|
@ -670,8 +670,13 @@ int wolfSSH_connect(WOLFSSH* ssh)
|
|||
}
|
||||
if ( (ssh->error =
|
||||
SendChannelOpenSession(ssh, newChannel)) < WS_SUCCESS) {
|
||||
|
||||
ChannelDelete(newChannel, ssh->ctx->heap);
|
||||
if (ssh->error == WS_WANT_WRITE ||
|
||||
ssh->error == WS_WANT_READ) {
|
||||
ChannelAppend(ssh, newChannel);
|
||||
}
|
||||
else {
|
||||
ChannelDelete(newChannel, ssh->ctx->heap);
|
||||
}
|
||||
WLOG(WS_LOG_DEBUG, connectError,
|
||||
"SERVER_USERAUTH_ACCEPT_DONE", ssh->error);
|
||||
return WS_FATAL_ERROR;
|
||||
|
|
Loading…
Reference in New Issue