From e5a1c38d86ef28ff93b39fa0154aa01a3e423077 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 31 Oct 2022 14:44:57 -0700 Subject: [PATCH] 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. --- examples/echoserver/echoserver.c | 233 +++++++++++++++++-------------- wolfssh/port.h | 2 +- 2 files changed, 133 insertions(+), 102 deletions(-) diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index fa17b99d..b15297d5 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -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 diff --git a/wolfssh/port.h b/wolfssh/port.h index afef8204..56ed2b73 100644 --- a/wolfssh/port.h +++ b/wolfssh/port.h @@ -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