mirror of https://github.com/wolfSSL/wolfssh.git
refactor introducing more use of NoticeError
parent
ff95f3c302
commit
2a11471bb7
|
|
@ -1416,8 +1416,11 @@ static int sftp_worker(thread_ctx_t* threadCtx)
|
|||
}
|
||||
else if (ret < 0) {
|
||||
error = wolfSSH_get_error(ssh);
|
||||
if (error == WS_EOF)
|
||||
if (error == WS_EOF) {
|
||||
/* shutdown is happening, clear peek error */
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == WS_FATAL_ERROR && error == 0) {
|
||||
|
|
|
|||
|
|
@ -566,11 +566,8 @@ static int doCmds(func_args* args)
|
|||
}
|
||||
|
||||
do {
|
||||
while (ret == WS_REKEYING || ssh->error == WS_REKEYING) {
|
||||
while (wolfSSH_get_error(ssh) == WS_REKEYING) {
|
||||
ret = wolfSSH_worker(ssh, NULL);
|
||||
if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR) {
|
||||
ret = wolfSSH_get_error(ssh);
|
||||
}
|
||||
}
|
||||
|
||||
ret = wolfSSH_SFTP_Get(ssh, pt, to, resume, &myStatusCb);
|
||||
|
|
@ -747,6 +744,13 @@ static int doCmds(func_args* args)
|
|||
|
||||
/* check directory is valid */
|
||||
do {
|
||||
while (ret == WS_REKEYING || ssh->error == WS_REKEYING) {
|
||||
ret = wolfSSH_worker(ssh, NULL);
|
||||
if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR) {
|
||||
ret = wolfSSH_get_error(ssh);
|
||||
}
|
||||
}
|
||||
|
||||
ret = wolfSSH_SFTP_STAT(ssh, pt, &atrb);
|
||||
err = wolfSSH_get_error(ssh);
|
||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||
|
|
@ -828,6 +832,13 @@ static int doCmds(func_args* args)
|
|||
|
||||
/* update permissions */
|
||||
do {
|
||||
while (ret == WS_REKEYING || ssh->error == WS_REKEYING) {
|
||||
ret = wolfSSH_worker(ssh, NULL);
|
||||
if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR) {
|
||||
ret = wolfSSH_get_error(ssh);
|
||||
}
|
||||
}
|
||||
|
||||
ret = wolfSSH_SFTP_CHMOD(ssh, pt, mode);
|
||||
err = wolfSSH_get_error(ssh);
|
||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||
|
|
@ -878,6 +889,13 @@ static int doCmds(func_args* args)
|
|||
}
|
||||
|
||||
do {
|
||||
while (ret == WS_REKEYING || ssh->error == WS_REKEYING) {
|
||||
ret = wolfSSH_worker(ssh, NULL);
|
||||
if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR) {
|
||||
ret = wolfSSH_get_error(ssh);
|
||||
}
|
||||
}
|
||||
|
||||
ret = wolfSSH_SFTP_RMDIR(ssh, pt);
|
||||
err = wolfSSH_get_error(ssh);
|
||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||
|
|
@ -924,6 +942,13 @@ static int doCmds(func_args* args)
|
|||
}
|
||||
|
||||
do {
|
||||
while (ret == WS_REKEYING || ssh->error == WS_REKEYING) {
|
||||
ret = wolfSSH_worker(ssh, NULL);
|
||||
if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR) {
|
||||
ret = wolfSSH_get_error(ssh);
|
||||
}
|
||||
}
|
||||
|
||||
ret = wolfSSH_SFTP_Remove(ssh, pt);
|
||||
err = wolfSSH_get_error(ssh);
|
||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||
|
|
@ -1458,14 +1483,52 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
|
|||
|
||||
WFREE(workingDir, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
if (ret == WS_SUCCESS) {
|
||||
if (wolfSSH_shutdown(ssh) != WS_SUCCESS) {
|
||||
int rc;
|
||||
rc = wolfSSH_get_error(ssh);
|
||||
int err;
|
||||
ret = wolfSSH_shutdown(ssh);
|
||||
|
||||
if (rc != WS_SOCKET_ERROR_E && rc != WS_EOF)
|
||||
printf("error with wolfSSH_shutdown()\n");
|
||||
/* peer hung up, stop trying to shutdown */
|
||||
if (ret == WS_SOCKET_ERROR_E) {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
err = wolfSSH_get_error(ssh);
|
||||
if (err != WS_SOCKET_ERROR_E &&
|
||||
(err == WS_WANT_READ || err == WS_WANT_WRITE)) {
|
||||
int maxAttempt = 10; /* make 10 attempts max before giving up */
|
||||
int attempt;
|
||||
|
||||
for (attempt = 0; attempt < maxAttempt; attempt++) {
|
||||
ret = wolfSSH_worker(ssh, NULL);
|
||||
err = wolfSSH_get_error(ssh);
|
||||
|
||||
/* peer succesfully closed down gracefully */
|
||||
if (ret == WS_CHANNEL_CLOSED) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* peer hung up, stop shutdown */
|
||||
if (ret == WS_SOCKET_ERROR_E) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (err == WS_WANT_READ || err == WS_WANT_WRITE) {
|
||||
/* Wanting read or wanting write. Clear ret. */
|
||||
ret = 0;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (attempt == maxAttempt) {
|
||||
printf("SFTP client gave up on gracefull shutdown,"
|
||||
"closing the socket\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WCLOSESOCKET(sockFd);
|
||||
wolfSSH_free(ssh);
|
||||
wolfSSH_CTX_free(ctx);
|
||||
|
|
|
|||
|
|
@ -865,6 +865,7 @@ static int SFTP_GetHeader(WOLFSSH* ssh, word32* reqId, byte* type,
|
|||
*/
|
||||
static int SFTP_SetHeader(WOLFSSH* ssh, word32 reqId, byte type, word32 len,
|
||||
byte* buf) {
|
||||
|
||||
c32toa(len + LENGTH_SZ + MSG_ID_SZ, buf);
|
||||
buf[LENGTH_SZ] = type;
|
||||
c32toa(reqId, buf + LENGTH_SZ + MSG_ID_SZ);
|
||||
|
|
@ -1170,8 +1171,9 @@ int wolfSSH_SFTP_accept(WOLFSSH* ssh)
|
|||
case SFTP_EXT:
|
||||
ret = SFTP_ServerRecvInit(ssh);
|
||||
if (ret != WS_SUCCESS) {
|
||||
if (ssh->error != WS_WANT_READ && ssh->error != WS_WANT_WRITE)
|
||||
if (!NoticeError(ssh)) {
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_ALL);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
ssh->sftpState = SFTP_RECV;
|
||||
|
|
@ -1573,8 +1575,9 @@ int wolfSSH_SFTP_read(WOLFSSH* ssh)
|
|||
|
||||
/* break out if encountering an error with nothing stored to send */
|
||||
if (ret < 0 && !state->toSend) {
|
||||
if (ssh->error != WS_WANT_READ && ssh->error != WS_WANT_WRITE)
|
||||
if (!NoticeError(ssh)) {
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RECV);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
state->buffer.idx = 0;
|
||||
|
|
@ -7674,8 +7677,8 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
|
|||
/* send header and type specific data */
|
||||
ret = wolfSSH_SFTP_buffer_send(ssh, &state->buffer);
|
||||
if (ret < 0) {
|
||||
if (ret == WS_REKEYING) {
|
||||
return ret;
|
||||
if (NoticeError(ssh)) {
|
||||
return WS_FATAL_ERROR;
|
||||
}
|
||||
if (ssh->error != WS_WANT_READ &&
|
||||
ssh->error != WS_WANT_WRITE) {
|
||||
|
|
@ -7693,14 +7696,12 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
|
|||
/* Get response */
|
||||
if ((ret = SFTP_GetHeader(ssh, &state->reqId, &state->type,
|
||||
&state->buffer)) <= 0) {
|
||||
if (ssh->error != WS_WANT_READ &&
|
||||
ssh->error != WS_WANT_WRITE) {
|
||||
if (!NoticeError(ssh)) {
|
||||
state->state = STATE_SEND_READ_CLEANUP;
|
||||
continue;
|
||||
}
|
||||
return WS_FATAL_ERROR;
|
||||
}
|
||||
|
||||
ret = wolfSSH_SFTP_buffer_create(ssh, &state->buffer, ret);
|
||||
if (ret != WS_SUCCESS) {
|
||||
state->state = STATE_SEND_READ_CLEANUP;
|
||||
|
|
@ -7718,8 +7719,9 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
|
|||
state->state = STATE_SEND_READ_CLEANUP;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
else {
|
||||
ssh->reqId++;
|
||||
}
|
||||
|
||||
if (state->type == WOLFSSH_FTP_DATA)
|
||||
state->state = STATE_SEND_READ_FTP_DATA;
|
||||
|
|
@ -7737,8 +7739,7 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
|
|||
/* get size of string and place it into out buffer */
|
||||
ret = wolfSSH_stream_read(ssh, szFlat, UINT32_SZ);
|
||||
if (ret < 0) {
|
||||
if (ssh->error != WS_WANT_READ &&
|
||||
ssh->error != WS_WANT_WRITE) {
|
||||
if (!NoticeError(ssh)) {
|
||||
state->state = STATE_SEND_READ_CLEANUP;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -7917,8 +7918,9 @@ int wolfSSH_SFTP_MKDIR(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr)
|
|||
/* send header and type specific data */
|
||||
ret = wolfSSH_SFTP_buffer_send(ssh, &state->buffer);
|
||||
if (ret < 0) {
|
||||
if (ssh->error != WS_WANT_READ && ssh->error != WS_WANT_WRITE)
|
||||
if (!NoticeError(ssh)) {
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_MKDIR);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -7931,8 +7933,9 @@ int wolfSSH_SFTP_MKDIR(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr)
|
|||
/* Get response */
|
||||
if ((ret = SFTP_GetHeader(ssh, &state->reqId, &type,
|
||||
&state->buffer)) <= 0) {
|
||||
if (ssh->error != WS_WANT_READ && ssh->error != WS_WANT_WRITE)
|
||||
if (!NoticeError(ssh)) {
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_MKDIR);
|
||||
}
|
||||
return WS_FATAL_ERROR;
|
||||
}
|
||||
|
||||
|
|
@ -7963,8 +7966,9 @@ int wolfSSH_SFTP_MKDIR(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr)
|
|||
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
|
||||
wolfSSH_SFTP_buffer_size(&state->buffer));
|
||||
if (ret < 0) {
|
||||
if (ssh->error != WS_WANT_READ && ssh->error != WS_WANT_WRITE)
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_MKDIR);
|
||||
if (!NoticeError(ssh)) {
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_MKDIR);
|
||||
}
|
||||
return WS_FATAL_ERROR;
|
||||
}
|
||||
|
||||
|
|
@ -8031,8 +8035,7 @@ WS_SFTPNAME* wolfSSH_SFTP_ReadDir(WOLFSSH* ssh, byte* handle,
|
|||
case STATE_READDIR_NAME:
|
||||
name = wolfSSH_SFTP_DoName(ssh);
|
||||
if (name == NULL) {
|
||||
if (ssh->error != WS_WANT_READ
|
||||
&& ssh->error != WS_WANT_WRITE) {
|
||||
if (!NoticeError(ssh)) {
|
||||
wolfSSH_SFTP_ClearState(ssh, STATE_ID_READDIR);
|
||||
}
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -1075,6 +1075,11 @@ static void test_wolfSSH_SFTP_SendReadPacket(void)
|
|||
}
|
||||
}
|
||||
|
||||
/* take care of re-keying state before shutdown call */
|
||||
while (wolfSSH_get_error(ssh) == WS_REKEYING) {
|
||||
wolfSSH_worker(ssh, NULL);
|
||||
}
|
||||
|
||||
argsCount = wolfSSH_shutdown(ssh);
|
||||
if (argsCount == WS_SOCKET_ERROR_E) {
|
||||
/* If the socket is closed on shutdown, peer is gone, this is OK. */
|
||||
|
|
|
|||
Loading…
Reference in New Issue