diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index e7ed95a..3c9fe0f 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -401,8 +401,20 @@ static THREAD_RETURN WOLFSSH_THREAD server_worker(void* vArgs) switch (ret) { case WS_SCP_COMPLETE: - printf("scp file transfer completed\n"); - ret = 0; + { + byte buf[1]; + printf("scp file transfer completed\n"); + if (wolfSSH_stream_exit(threadCtx->ssh, 0) != WS_SUCCESS) { + fprintf(stderr, "Error with SSH stream exit.\n"); + } + /* Peer MUST send back a SSH_MSG_CHANNEL_CLOSE unless already + * sent*/ + ret = wolfSSH_stream_read(threadCtx->ssh, buf, 1); + if (ret != WS_EOF) { + fprintf(stderr, "Was expecting EOF\n"); + } + ret = 0; + } break; case WS_SFTP_COMPLETE: diff --git a/src/ssh.c b/src/ssh.c index e8aa221..5aedc53 100644 --- a/src/ssh.c +++ b/src/ssh.c @@ -873,6 +873,11 @@ int wolfSSH_shutdown(WOLFSSH* ssh) if (ret == WS_SUCCESS) ret = SendDisconnect(ssh, WOLFSSH_DISCONNECT_BY_APPLICATION); + if (ssh != NULL && ssh->channelList == NULL) { + WLOG(WS_LOG_DEBUG, "channel list was already removed"); + ret = WS_SUCCESS; + } + WLOG(WS_LOG_DEBUG, "Leaving wolfSSH_shutdown(), ret = %d", ret); return ret; }