Merge pull request #487 from JacobBarthelmeh/pathing

set ssh error in sftp status not ok state
pull/492/head
John Safranek 2023-01-24 15:35:32 -08:00 committed by GitHub
commit 1a58568eac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 25 deletions

View File

@ -1013,7 +1013,7 @@ static int doCmds(func_args* args)
do {
ret = wolfSSH_SFTP_Get(ssh, pt, to, resume, &myStatusCb);
if (ret != WS_SUCCESS) {
if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR) {
ret = wolfSSH_get_error(ssh);
}
} while (ret == WS_WANT_READ || ret == WS_WANT_WRITE ||
@ -1113,7 +1113,7 @@ static int doCmds(func_args* args)
ret = wolfSSH_SFTP_Put(ssh, pt, to, resume, &myStatusCb);
err = wolfSSH_get_error(ssh);
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
err == WS_CHAN_RXD) && ret != WS_SUCCESS);
err == WS_CHAN_RXD) && ret == WS_FATAL_ERROR);
#ifndef WOLFSSH_NO_TIMESTAMP
WMEMSET(currentFile, 0, WOLFSSH_MAX_FILENAME);
@ -1544,7 +1544,7 @@ 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_SUCCESS);
err == WS_CHAN_RXD) && ret == WS_FATAL_ERROR);
if (ret != WS_SUCCESS) {
if (cmd == AUTOPILOT_PUT) {

View File

@ -86,6 +86,16 @@ then
exit 1
fi
# Test fail on file that does not exist
rm -rf sample1-does-not-exist
if ./examples/sftpclient/wolfsftp -u jill -P upthehill -p "$PORT" \
-G -l sample1-copy.txt -r sample1-does-not-exist
then
echo "Success when expecting fail to get file."
do_cleanup
exit 1
fi
# Put test.
if ! ./examples/sftpclient/wolfsftp -u jill -P upthehill -p "$PORT" \
-g -l sample2.txt -r sample2-copy.txt

View File

@ -5878,8 +5878,10 @@ static int wolfSSH_SFTP_GetHandle(WOLFSSH* ssh, byte* handle, word32* handleSz)
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
if (ret == WOLFSSH_FTP_OK)
ret = WS_SUCCESS;
else
ret = WS_FATAL_ERROR;
else {
*handleSz = 0; /* error getting handle */
ret = WS_SFTP_STATUS_NOT_OK;
}
state->state = STATE_GET_HANDLE_CLEANUP;
continue;
@ -6273,7 +6275,7 @@ static int SFTP_STAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr, byte type)
if (ret == WOLFSSH_FTP_PERMISSION) {
return WS_PERMISSIONS;
}
return WS_FATAL_ERROR;
return WS_SFTP_STATUS_NOT_OK;
}
}
else {
@ -6804,8 +6806,7 @@ int wolfSSH_SFTP_SendWritePacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
}
else if (status != WOLFSSH_FTP_OK) {
/* @TODO better error value description i.e permissions */
ssh->error = WS_SFTP_STATUS_NOT_OK;
ret = WS_FATAL_ERROR;
ret = WS_SFTP_STATUS_NOT_OK;
}
if (ret >= WS_SUCCESS)
ret = sentSzSave;
@ -7646,8 +7647,7 @@ int wolfSSH_SFTP_Rename(WOLFSSH* ssh, const char* old, const char* nw)
ret = WS_FATAL_ERROR;
}
else if (ret != WOLFSSH_FTP_OK) {
ssh->error = WS_SFTP_STATUS_NOT_OK;
ret = WS_FATAL_ERROR;
ret = WS_SFTP_STATUS_NOT_OK;
}
state->state = STATE_RENAME_CLEANUP;
NO_BREAK;
@ -8002,6 +8002,9 @@ void wolfSSH_SFTP_Interrupt(WOLFSSH* ssh)
* loop with bytes written.
*
* returns WS_SUCCESS on success
* returns WS_FATAL_ERROR on low level error or SSH level error
* call wolfSSH_get_error(ssh) to try to get SSH error
* other reuturn values are error states during the SFTP get process
*/
int wolfSSH_SFTP_Get(WOLFSSH* ssh, char* from,
char* to, byte resume, WS_STATUS_CB* statusCb)
@ -8177,15 +8180,17 @@ int wolfSSH_SFTP_Get(WOLFSSH* ssh, char* from,
NO_BREAK;
case STATE_GET_CLOSE_REMOTE:
WLOG(WS_LOG_SFTP, "SFTP GET STATE: CLOSE REMOTE");
ret = wolfSSH_SFTP_Close(ssh,
if (state->handleSz > 0) {
WLOG(WS_LOG_SFTP, "SFTP GET STATE: CLOSE REMOTE");
ret = wolfSSH_SFTP_Close(ssh,
state->handle, state->handleSz);
if (ret != WS_SUCCESS) {
if (ssh->error == WS_WANT_READ ||
ssh->error == WS_WANT_WRITE) {
return WS_FATAL_ERROR;
if (ret != WS_SUCCESS) {
if (ssh->error == WS_WANT_READ ||
ssh->error == WS_WANT_WRITE) {
return WS_FATAL_ERROR;
}
WLOG(WS_LOG_SFTP, "Error closing remote handle");
}
WLOG(WS_LOG_SFTP, "Error closing remote handle");
}
state->state = STATE_GET_CLOSE_LOCAL;
NO_BREAK;
@ -8393,15 +8398,18 @@ int wolfSSH_SFTP_Put(WOLFSSH* ssh, char* from, char* to, byte resume,
NO_BREAK;
case STATE_PUT_CLOSE_REMOTE:
WLOG(WS_LOG_SFTP, "SFTP PUT STATE: CLOSE REMOTE");
ret = wolfSSH_SFTP_Close(ssh, state->handle, state->handleSz);
if (ret != WS_SUCCESS) {
if (ssh->error == WS_WANT_READ ||
ssh->error == WS_WANT_WRITE) {
return WS_FATAL_ERROR;
if (state->handleSz > 0) {
WLOG(WS_LOG_SFTP, "SFTP PUT STATE: CLOSE REMOTE");
ret = wolfSSH_SFTP_Close(ssh, state->handle,
state->handleSz);
if (ret != WS_SUCCESS) {
if (ssh->error == WS_WANT_READ ||
ssh->error == WS_WANT_WRITE) {
return WS_FATAL_ERROR;
}
WLOG(WS_LOG_SFTP, "Error closing handle");
/* Fall through to cleanup. */
}
WLOG(WS_LOG_SFTP, "Error closing handle");
/* Fall through to cleanup. */
}
state->state = STATE_PUT_CLEANUP;
NO_BREAK;