diff --git a/examples/sftpclient/sftpclient.c b/examples/sftpclient/sftpclient.c index 53be6275..55891f1c 100644 --- a/examples/sftpclient/sftpclient.c +++ b/examples/sftpclient/sftpclient.c @@ -1160,7 +1160,8 @@ static int doAutopilot(int cmd, char* local, char* remote) } err = wolfSSH_get_error(ssh); } while ((err == WS_WANT_READ || err == WS_WANT_WRITE || - err == WS_CHAN_RXD) && ret == WS_FATAL_ERROR); + err == WS_CHAN_RXD || err == WS_REKEYING) && + ret == WS_FATAL_ERROR); if (ret != WS_SUCCESS) { if (cmd == AUTOPILOT_PUT) { diff --git a/src/wolfsftp.c b/src/wolfsftp.c index e4ef039b..594990cd 100644 --- a/src/wolfsftp.c +++ b/src/wolfsftp.c @@ -515,6 +515,7 @@ static void wolfSSH_SFTP_buffer_rewind(WS_SFTP_BUFFER* buffer) static int wolfSSH_SFTP_buffer_send(WOLFSSH* ssh, WS_SFTP_BUFFER* buffer) { int ret = WS_SUCCESS; + int err; if (buffer == NULL) { return WS_BAD_ARGUMENT; @@ -524,6 +525,12 @@ static int wolfSSH_SFTP_buffer_send(WOLFSSH* ssh, WS_SFTP_BUFFER* buffer) return WS_BUFFER_E; } + /* Call wolfSSH worker if rekeying or adjusting window size */ + err = wolfSSH_get_error(ssh); + if (err == WS_WINDOW_FULL || err == WS_REKEYING) { + (void)wolfSSH_worker(ssh, NULL); + } + if (buffer->idx < buffer->sz) { ret = wolfSSH_stream_send(ssh, buffer->data + buffer->idx, buffer->sz - buffer->idx); @@ -1411,8 +1418,9 @@ int wolfSSH_SFTP_read(WOLFSSH* ssh) ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer, state->buffer.sz); if (ret < 0) { - if (ssh->error != WS_WANT_READ && ssh->error != WS_WANT_WRITE) - wolfSSH_SFTP_ClearState(ssh, STATE_ID_RECV); + if (!NoticeError(ssh)) { + wolfSSH_SFTP_ClearState(ssh, STATE_ID_RECV); + } return ret; } @@ -5919,14 +5927,7 @@ int SendPacketType(WOLFSSH* ssh, byte type, byte* buf, word32 bufSz) * because channel could have restrictions on how much * state->data can be sent at one time */ do { - int err; ret = wolfSSH_SFTP_buffer_send(ssh, &state->buffer); - - /* check for adjust window packet */ - err = wolfSSH_get_error(ssh); - if (err == WS_WINDOW_FULL || err == WS_REKEYING) - ret = wolfSSH_worker(ssh, NULL); - ssh->error = err; /* don't save potential want read here */ } while (ret > 0 && wolfSSH_SFTP_buffer_idx(&state->buffer) < wolfSSH_SFTP_buffer_size(&state->buffer)); @@ -6560,8 +6561,7 @@ static int wolfSSH_SFTP_GetHandle(WOLFSSH* ssh, byte* handle, word32* handleSz) WLOG(WS_LOG_SFTP, "SFTP GET HANDLE STATE: GET_HEADER"); ret = SFTP_GetHeader(ssh, &state->reqId, &type, &state->buffer); if (ret <= 0) { - if (ssh->error == WS_WANT_READ || - ssh->error == WS_WANT_WRITE) { + if (NoticeError(ssh)) { return WS_FATAL_ERROR; } else { @@ -8082,9 +8082,8 @@ int wolfSSH_SFTP_Close(WOLFSSH* ssh, byte* handle, word32 handleSz) case STATE_CLOSE_SEND: WLOG(WS_LOG_SFTP, "SFTP CLOSE STATE: SEND"); ret = SendPacketType(ssh, WOLFSSH_FTP_CLOSE, handle, handleSz); - if (ssh->error == WS_WANT_WRITE || ssh->error == WS_WANT_READ) - { - return ret; + if (NoticeError(ssh)) { + return WS_FATAL_ERROR; } if (ret != WS_SUCCESS) { @@ -8097,10 +8096,9 @@ int wolfSSH_SFTP_Close(WOLFSSH* ssh, byte* handle, word32 handleSz) case STATE_CLOSE_GET_HEADER: WLOG(WS_LOG_SFTP, "SFTP CLOSE STATE: GET_HEADER"); ret = SFTP_GetHeader(ssh, &state->reqId, &type, &state->buffer); - if (ret <= 0 && - (ssh->error == WS_WANT_WRITE || - ssh->error == WS_WANT_READ)) - return ret; + if (ret <= 0 && NoticeError(ssh)) { + return WS_FATAL_ERROR; + } if (type != WOLFSSH_FTP_STATUS || ret <= 0) { WLOG(WS_LOG_SFTP, "Unexpected packet type"); @@ -9204,9 +9202,7 @@ int wolfSSH_SFTP_Put(WOLFSSH* ssh, char* from, char* to, byte resume, ret = wolfSSH_SFTP_Close(ssh, state->handle, state->handleSz); if (ret != WS_SUCCESS) { - if (ssh->error == WS_WANT_READ || - ssh->error == WS_WANT_WRITE || - ssh->error == WS_REKEYING) { + if (NoticeError(ssh)) { return WS_FATAL_ERROR; } WLOG(WS_LOG_SFTP, "Error closing handle");