diff --git a/examples/scpclient/scpclient.c b/examples/scpclient/scpclient.c index 980b74afc..d974550bf 100644 --- a/examples/scpclient/scpclient.c +++ b/examples/scpclient/scpclient.c @@ -309,8 +309,10 @@ THREAD_RETURN WOLFSSH_THREAD scp_client(void* args) } } while (ret == WS_WANT_READ || ret == WS_WANT_WRITE || ret == WS_CHAN_RXD || ret == WS_REKEYING); - if (ret != WS_SUCCESS) - err_sys("Couldn't copy the file."); + if (ret != WS_SUCCESS) { + fprintf(stderr, "Couldn't copy the file."); + ((func_args*)args)->return_code = 1; + } ret = wolfSSH_shutdown(ssh); /* do not continue on with shutdown process if peer already disconnected */ @@ -318,11 +320,14 @@ THREAD_RETURN WOLFSSH_THREAD scp_client(void* args) wolfSSH_get_error(ssh) != WS_SOCKET_ERROR_E && wolfSSH_get_error(ssh) != WS_CHANNEL_CLOSED) { if (ret != WS_SUCCESS) { - err_sys("Sending the shutdown messages failed."); + WLOG(WS_LOG_DEBUG, "Sending the shutdown messages failed."); } - ret = wolfSSH_worker(ssh, NULL); - if (ret != WS_SUCCESS && ret != WS_CHANNEL_CLOSED) { - err_sys("Failed to listen for close messages from the peer."); + else { + ret = wolfSSH_worker(ssh, NULL); + if (ret != WS_SUCCESS && ret != WS_CHANNEL_CLOSED) { + WLOG(WS_LOG_DEBUG, + "Failed to listen for close messages from the peer."); + } } } WCLOSESOCKET(sockFd); @@ -330,7 +335,8 @@ THREAD_RETURN WOLFSSH_THREAD scp_client(void* args) wolfSSH_CTX_free(ctx); if (ret != WS_SUCCESS && ret != WS_SOCKET_ERROR_E && ret != WS_CHANNEL_CLOSED) { - err_sys("Closing scp stream failed. Connection could have been closed by peer"); + WLOG(WS_LOG_DEBUG, + "Closing scp stream failed. Connection could have been closed by peer"); } ClientFreeBuffers(pubKeyName, privKeyName, NULL); @@ -338,6 +344,8 @@ THREAD_RETURN WOLFSSH_THREAD scp_client(void* args) wc_ecc_fp_free(); /* free per thread cache */ #endif + if (ret != WS_SUCCESS) + ((func_args*)args)->return_code = 1; return 0; } diff --git a/src/wolfscp.c b/src/wolfscp.c index 1be04b2af..5e35fee0c 100644 --- a/src/wolfscp.c +++ b/src/wolfscp.c @@ -610,6 +610,15 @@ int DoScpSource(WOLFSSH* ssh) continue; } if (ret < 0) { + #if !defined(NO_FILESYSTEM) && \ + !defined(WOLFSSH_SCP_USER_CALLBACKS) + /* if the socket send had a fatal error, try to close any + * open file descriptor before exit */ + ScpSendCtx* sendCtx = NULL; + sendCtx = (ScpSendCtx*)wolfSSH_GetScpSendCtx(ssh); + if (sendCtx != NULL) + WFCLOSE(ssh->fs, sendCtx->fp); + #endif WLOG(WS_LOG_ERROR, scpError, "failed to send file", ret); break; }