Echoserver Driver

1. Leave out the setup of the tcp_ready record when not using threading.
2. Don't change the echoserver directory when building for Integrity.
3. Change WEXIT to be a return(0) when building for Integrity.
4. The echoserver shouldn't call exit directly, it should save the
   return_code server args and then return to the caller.
5. When using forwarding, don't exit if the address is IPv6, return an
   error.
6. When exiting, close the listen file descriptor.
7. Reset myoptind to 0 before processing the options list.
pull/474/head
John Safranek 2022-10-31 14:44:57 -07:00
parent f0270d8920
commit e5a1c38d86
No known key found for this signature in database
GPG Key ID: 8CE817DE0D3CCB4A
2 changed files with 133 additions and 102 deletions

View File

@ -477,9 +477,11 @@ static int wolfSSH_FwdDefaultActions(WS_FwdCbAction action, void* vCtx,
}
else {
printf("Not using IPv6 yet.\n");
WEXIT(EXIT_FAILURE);
ret = WS_FWD_SETUP_E;
}
}
if (ret == 0) {
ret = bind(ctx->listenFd,
(const struct sockaddr*)&addr, addrSz);
}
@ -1269,14 +1271,10 @@ static THREAD_RETURN WOLFSSH_THREAD server_worker(void* vArgs)
ret = 0;
break;
case WS_SFTP_COMPLETE:
#ifdef WOLFSSH_SFTP
case WS_SFTP_COMPLETE:
ret = sftp_worker(threadCtx);
break;
#else
err_sys("SFTP not compiled in. Please use --enable-sftp");
WEXIT(EXIT_FAILURE);
NO_BREAK;
#endif
case WS_SUCCESS:
@ -2095,7 +2093,8 @@ static void ShowUsage(void)
static void SignalTcpReady(func_args* serverArgs, word16 port)
{
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && !defined(__MINGW32__)
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && \
!defined(__MINGW32__) && !defined(SINGLE_THREADED)
tcp_ready* ready = serverArgs->signal;
pthread_mutex_lock(&ready->mutex);
ready->ready = 1;
@ -2137,99 +2136,106 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
int argc = serverArgs->argc;
char** argv = serverArgs->argv;
serverArgs->return_code = 0;
serverArgs->return_code = EXIT_SUCCESS;
if (argc > 0) {
while ((ch = mygetopt(argc, argv, "?1a:d:efEp:R:Ni:j:I:J:K:P:")) != -1) {
switch (ch) {
case '?' :
ShowUsage();
WEXIT(EXIT_SUCCESS);
const char* optlist = "?1a:d:efEp:R:Ni:j:I:J:K:P:";
myoptind = 0;
while ((ch = mygetopt(argc, argv, optlist)) != -1) {
switch (ch) {
case '?' :
ShowUsage();
serverArgs->return_code = MY_EX_USAGE;
return 0;
case '1':
multipleConnections = 0;
break;
case '1':
multipleConnections = 0;
break;
case 'a':
#ifdef WOLFSSH_CERTS
caCert = myoptarg;
#endif
break;
case 'e' :
userEcc = 1;
break;
case 'E':
peerEcc = 1;
break;
case 'f':
#ifdef WOLFSSH_SHELL
echo = 1;
#endif
break;
case 'p':
if (myoptarg == NULL) {
err_sys("NULL port value");
WEXIT(EXIT_FAILURE);
}
else {
port = (word16)atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
if (port == 0) {
err_sys("port number cannot be 0");
WEXIT(EXIT_FAILURE);
}
case 'a':
#ifdef WOLFSSH_CERTS
caCert = myoptarg;
#endif
}
break;
break;
case 'e' :
userEcc = 1;
break;
case 'R':
readyFile = myoptarg;
break;
case 'E':
peerEcc = 1;
break;
case 'N':
nonBlock = 1;
break;
case 'f':
#ifdef WOLFSSH_SHELL
echo = 1;
#endif
break;
case 'd':
defaultSftpPath = myoptarg;
break;
case 'p':
if (myoptarg == NULL) {
err_sys("NULL port value");
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
else {
port = (word16)atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
if (port == 0) {
err_sys("port number cannot be 0");
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
#endif
}
break;
case 'j':
userPubKey = myoptarg;
break;
case 'R':
readyFile = myoptarg;
break;
case 'I':
sshPubKeyList = StrListAdd(sshPubKeyList, myoptarg);
break;
case 'N':
nonBlock = 1;
break;
case 'J':
pemPubKeyList = StrListAdd(pemPubKeyList, myoptarg);
break;
case 'd':
defaultSftpPath = myoptarg;
break;
case 'K':
derPubKeyList = StrListAdd(derPubKeyList, myoptarg);
break;
case 'j':
userPubKey = myoptarg;
break;
case 'P':
passwdList = StrListAdd(passwdList, myoptarg);
break;
case 'I':
sshPubKeyList = StrListAdd(sshPubKeyList, myoptarg);
break;
default:
ShowUsage();
WEXIT(MY_EX_USAGE);
case 'J':
pemPubKeyList = StrListAdd(pemPubKeyList, myoptarg);
break;
case 'K':
derPubKeyList = StrListAdd(derPubKeyList, myoptarg);
break;
case 'P':
passwdList = StrListAdd(passwdList, myoptarg);
break;
default:
ShowUsage();
serverArgs->return_code = MY_EX_USAGE;
return 0;
}
}
}
}
myoptind = 0; /* reset for test cases */
wc_InitMutex(&doneLock);
#ifdef WOLFSSH_TEST_BLOCK
if (!nonBlock) {
err_sys("Use -N when testing forced non blocking");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
#endif
@ -2247,13 +2253,15 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
if (wolfSSH_Init() != WS_SUCCESS) {
fprintf(stderr, "Couldn't initialize wolfSSH.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, NULL);
if (ctx == NULL) {
fprintf(stderr, "Couldn't allocate SSH CTX data.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
WMEMSET(&pwMapList, 0, sizeof(pwMapList));
@ -2303,7 +2311,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
keyLoadBuf = (byte*)WMALLOC(EXAMPLE_KEYLOAD_BUFFER_SZ,
NULL, 0);
if (keyLoadBuf == NULL) {
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
#else
keyLoadBuf = buf;
@ -2313,12 +2322,14 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
bufSz = load_key(peerEcc, keyLoadBuf, bufSz);
if (bufSz == 0) {
fprintf(stderr, "Couldn't load first key file.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
if (wolfSSH_CTX_UsePrivateKey_buffer(ctx, keyLoadBuf, bufSz,
WOLFSSH_FORMAT_ASN1) < 0) {
fprintf(stderr, "Couldn't use first key buffer.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
peerEcc = !peerEcc;
@ -2327,12 +2338,14 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
bufSz = load_key(peerEcc, keyLoadBuf, bufSz);
if (bufSz == 0) {
fprintf(stderr, "Couldn't load second key file.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
if (wolfSSH_CTX_UsePrivateKey_buffer(ctx, keyLoadBuf, bufSz,
WOLFSSH_FORMAT_ASN1) < 0) {
fprintf(stderr, "Couldn't use second key buffer.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
if (userPubKey) {
@ -2345,13 +2358,15 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
/* create temp buffer and load in file */
if (userBufSz == 0) {
fprintf(stderr, "Couldn't find size of file %s.\n", userPubKey);
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
userBuf = (byte*)WMALLOC(userBufSz, NULL, 0);
if (userBuf == NULL) {
fprintf(stderr, "WMALLOC failed\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
load_file(userPubKey, userBuf, &userBufSz);
LoadPublicKeyBuffer(userBuf, userBufSz, &pwMapList);
@ -2369,20 +2384,23 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
if (certBufSz == 0) {
fprintf(stderr,
"Couldn't find size of file %s.\n", caCert);
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
certBuf = (byte*)WMALLOC(certBufSz, NULL, 0);
if (certBuf == NULL) {
fprintf(stderr, "WMALLOC failed\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
load_file(caCert, certBuf, &certBufSz);
ret = wolfSSH_CTX_AddRootCert_buffer(ctx, certBuf, certBufSz,
WOLFSSH_FORMAT_PEM);
if (ret != 0) {
fprintf(stderr, "Couldn't add root cert\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
WFREE(certBuf, NULL, 0);
}
@ -2429,7 +2447,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
/* wait for network and storage device */
if (NETBOOT_Wait_For_Network_Up(NU_SUSPEND) != NU_SUCCESS) {
fprintf(stderr, "Couldn't find network.\r\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
for(i = 0; i < 15 && ret != NU_SUCCESS; i++)
@ -2441,7 +2460,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
if (ret != NU_SUCCESS) {
fprintf(stderr, "Couldn't find storage device.\r\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
}
#endif
@ -2450,9 +2470,11 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
if (readyFile != NULL) {
#ifdef NO_FILESYSTEM
fprintf(stderr, "cannot create readyFile with no file system.\r\n");
WEXIT(EXIT_FAILURE);
#endif
serverArgs->return_code = EXIT_FAILURE;
return 0;
#else
port = 0;
#endif
}
tcp_listen(&listenFd, &port, 1);
/* write out port number listing to, to user set ready file */
@ -2483,7 +2505,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
NULL, 0);
if (threadCtx == NULL) {
fprintf(stderr, "Couldn't allocate thread context data.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
WMEMSET(threadCtx, 0, sizeof *threadCtx);
@ -2491,7 +2514,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
if (ssh == NULL) {
WFREE(threadCtx, NULL, 0);
fprintf(stderr, "Couldn't allocate SSH data.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
wolfSSH_SetUserAuthCtx(ssh, &pwMapList);
/* Use the session object for its own highwater callback ctx */
@ -2503,7 +2527,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
#ifdef WOLFSSH_SFTP
if (SetDefaultSftpPath(ssh, defaultSftpPath) != 0) {
fprintf(stderr, "Couldn't store default sftp path.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
#endif
@ -2520,7 +2545,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
* 0.0.0.0 if ip adder any */
if (NU_Get_Sock_Name(listenFd, &sock, &addrLength) != NU_SUCCESS) {
fprintf(stderr, "Couldn't find network.\r\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
WMEMCPY(ipaddr, &sock.ip_num, MAX_ADDRESS_SIZE);
@ -2539,7 +2565,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
#endif
if (clientFd == -1) {
err_sys("tcp accept failed");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
if (nonBlock)
@ -2568,12 +2595,16 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
} while (multipleConnections && !quit);
if (listenFd != 0) {
WCLOSESOCKET(listenFd);
}
wc_FreeMutex(&doneLock);
PwMapListDelete(&pwMapList);
wolfSSH_CTX_free(ctx);
if (wolfSSH_Cleanup() != WS_SUCCESS) {
fprintf(stderr, "Couldn't clean up wolfSSH.\n");
WEXIT(EXIT_FAILURE);
serverArgs->return_code = EXIT_FAILURE;
return 0;
}
#if !defined(WOLFSSH_NO_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS)
wc_ecc_fp_free(); /* free per thread cache */
@ -2604,7 +2635,7 @@ int wolfSSH_Echoserver(int argc, char** argv)
wolfSSH_Debugging_ON();
#endif
#ifndef WOLFSSL_NUCLEUS
#if !defined(WOLFSSL_NUCLEUS) && !defined(INTEGRITY) && !defined(__INTEGRITY)
ChangeToWolfSshRoot();
#endif
#ifndef NO_WOLFSSH_SERVER

View File

@ -76,7 +76,7 @@ extern "C" {
#if defined(INTEGRITY) || defined(__INTEGRITY)
#define WEXIT(n) return (n)
#define WEXIT(n) return (0)
#else
#define WEXIT(n) exit((n))
#endif