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 */
|
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) {
|
if (wolfSSH_Init() != WS_SUCCESS) {
|
||||||
fprintf(stderr, "Couldn't initialize wolfSSH.\n");
|
fprintf(stderr, "Couldn't initialize wolfSSH.\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
|
@ -937,6 +937,13 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
|
||||||
if (username == NULL)
|
if (username == NULL)
|
||||||
err_sys("client requires a username parameter.");
|
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);
|
ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);
|
||||||
if (ctx == NULL)
|
if (ctx == NULL)
|
||||||
err_sys("Couldn't create wolfSSH client context.");
|
err_sys("Couldn't create wolfSSH client context.");
|
||||||
|
|
26
src/io.c
26
src/io.c
|
@ -38,6 +38,16 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#endif
|
#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 */
|
/* allow I/O callback handlers whether user I/O or not */
|
||||||
|
|
||||||
|
@ -300,7 +310,6 @@ static INLINE int LastError(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The receive embedded callback
|
/* The receive embedded callback
|
||||||
* return : nb bytes read, or error
|
* return : nb bytes read, or error
|
||||||
*/
|
*/
|
||||||
|
@ -311,6 +320,14 @@ int wsEmbedRecv(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
|
||||||
int sd = *(int*)ctx;
|
int sd = *(int*)ctx;
|
||||||
char* buf = (char*)data;
|
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 = (int)RECV_FUNCTION(sd, buf, sz, ssh->rflags);
|
||||||
|
|
||||||
recvd = TranslateReturnCode(recvd, sd);
|
recvd = TranslateReturnCode(recvd, sd);
|
||||||
|
@ -363,6 +380,13 @@ int wsEmbedSend(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
|
||||||
int err;
|
int err;
|
||||||
char* buf = (char*)data;
|
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);
|
WLOG(WS_LOG_DEBUG,"Embed Send trying to send %d", sz);
|
||||||
|
|
||||||
#ifdef MICROCHIP_MPLAB_HARMONY
|
#ifdef MICROCHIP_MPLAB_HARMONY
|
||||||
|
|
15
src/ssh.c
15
src/ssh.c
|
@ -277,7 +277,8 @@ int wolfSSH_accept(WOLFSSH* ssh)
|
||||||
if (ssh->acceptState != ACCEPT_SERVER_VERSION_SENT &&
|
if (ssh->acceptState != ACCEPT_SERVER_VERSION_SENT &&
|
||||||
ssh->acceptState != ACCEPT_SERVER_USERAUTH_ACCEPT_SENT &&
|
ssh->acceptState != ACCEPT_SERVER_USERAUTH_ACCEPT_SENT &&
|
||||||
ssh->acceptState != ACCEPT_SERVER_KEXINIT_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");
|
WLOG(WS_LOG_DEBUG, "Advancing accept state");
|
||||||
ssh->acceptState++;
|
ssh->acceptState++;
|
||||||
}
|
}
|
||||||
|
@ -439,8 +440,6 @@ int wolfSSH_accept(WOLFSSH* ssh)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ssh->acceptState = ACCEPT_CLIENT_SESSION_ESTABLISHED;
|
|
||||||
WLOG(WS_LOG_DEBUG, acceptState, "CLIENT_SESSION_ESTABLISHED");
|
|
||||||
#if defined(WOLFSSH_SFTP) && !defined(NO_WOLFSSH_SERVER)
|
#if defined(WOLFSSH_SFTP) && !defined(NO_WOLFSSH_SERVER)
|
||||||
{
|
{
|
||||||
const char* cmd = wolfSSH_GetSessionCommand(ssh);
|
const char* cmd = wolfSSH_GetSessionCommand(ssh);
|
||||||
|
@ -452,6 +451,8 @@ int wolfSSH_accept(WOLFSSH* ssh)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* WOLFSSH_SFTP and !NO_WOLFSSH_SERVER */
|
#endif /* WOLFSSH_SFTP and !NO_WOLFSSH_SERVER */
|
||||||
|
ssh->acceptState = ACCEPT_CLIENT_SESSION_ESTABLISHED;
|
||||||
|
WLOG(WS_LOG_DEBUG, acceptState, "CLIENT_SESSION_ESTABLISHED");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef WOLFSSH_SCP
|
#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_OPEN_SESSION_SENT &&
|
||||||
ssh->connectState != CONNECT_CLIENT_CHANNEL_REQUEST_SENT) {
|
ssh->connectState != CONNECT_CLIENT_CHANNEL_REQUEST_SENT) {
|
||||||
WLOG(WS_LOG_DEBUG, "Advancing connect state");
|
WLOG(WS_LOG_DEBUG, "Advancing connect state");
|
||||||
printf("advance connect state\n");
|
|
||||||
ssh->connectState++;
|
ssh->connectState++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,8 +670,13 @@ int wolfSSH_connect(WOLFSSH* ssh)
|
||||||
}
|
}
|
||||||
if ( (ssh->error =
|
if ( (ssh->error =
|
||||||
SendChannelOpenSession(ssh, newChannel)) < WS_SUCCESS) {
|
SendChannelOpenSession(ssh, newChannel)) < WS_SUCCESS) {
|
||||||
|
if (ssh->error == WS_WANT_WRITE ||
|
||||||
|
ssh->error == WS_WANT_READ) {
|
||||||
|
ChannelAppend(ssh, newChannel);
|
||||||
|
}
|
||||||
|
else {
|
||||||
ChannelDelete(newChannel, ssh->ctx->heap);
|
ChannelDelete(newChannel, ssh->ctx->heap);
|
||||||
|
}
|
||||||
WLOG(WS_LOG_DEBUG, connectError,
|
WLOG(WS_LOG_DEBUG, connectError,
|
||||||
"SERVER_USERAUTH_ACCEPT_DONE", ssh->error);
|
"SERVER_USERAUTH_ACCEPT_DONE", ssh->error);
|
||||||
return WS_FATAL_ERROR;
|
return WS_FATAL_ERROR;
|
||||||
|
|
Loading…
Reference in New Issue