Bug fix in SFTP_Put where it would just fail with a non-blocking socket.

Caused by three issues:
1. an unsigned return code was checked for a negative error code
2. a state was skipped in the case of a would block situation
3. a possible blocking point wasn't getting checked for want-read or
write.
pull/134/head
John Safranek 2019-01-07 13:21:20 -08:00
parent 6d295bc396
commit 67ec3a0bad
1 changed files with 10 additions and 3 deletions

View File

@ -281,7 +281,7 @@ typedef struct WS_SFTP_SEND_WRITE_STATE {
word32 reqId;
word32 idx;
int maxSz;
word32 sentSz;
int sentSz;
} WS_SFTP_SEND_WRITE_STATE;
@ -4664,6 +4664,8 @@ int wolfSSH_SFTP_SendWritePacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
ssh->error == WS_WANT_WRITE) {
return WS_FATAL_ERROR;
}
ssh->error = state->sentSz;
ret = WS_FATAL_ERROR;
state->state = STATE_SEND_WRITE_CLEANUP;
continue;
}
@ -6098,7 +6100,7 @@ int wolfSSH_SFTP_Put(WOLFSSH* ssh, char* from, char* to, byte resume,
state->pOfst = (long)wolfSSH_SFTP_GetOfst(ssh, from, to);
}
state->handleSz = WOLFSSH_MAX_HANDLE;
state->state = STATE_PUT_OPEN_LOCAL;
state->state = STATE_PUT_OPEN_REMOTE;
FALL_THROUGH;
case STATE_PUT_OPEN_REMOTE:
@ -6145,7 +6147,12 @@ int wolfSSH_SFTP_Put(WOLFSSH* ssh, char* from, char* to, byte resume,
sz = wolfSSH_SFTP_SendWritePacket(ssh,
state->handle, state->handleSz, state->pOfst,
state->r, state->rSz);
if (sz > 0) {
if (sz <= 0) {
if (ssh->error == WS_WANT_READ ||
ssh->error == WS_WANT_WRITE)
return WS_FATAL_ERROR;
}
else {
state->pOfst += sz;
state->rSz -= sz;
if (statusCb != NULL) {