From 9bba844e35adfd36f1f21da9857c52cfe94487ef Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 7 Jan 2019 14:12:12 -0800 Subject: [PATCH] Put file should fail if the local file doesn't exist before trying to open the remote file. Rearrange the Put state machine. Add an error code for SFTP_FILE_DNE. --- src/internal.c | 3 +++ src/wolfsftp.c | 28 ++++++++++++++-------------- wolfssh/error.h | 3 ++- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/internal.c b/src/internal.c index 2afdcb3..369d4ee 100644 --- a/src/internal.c +++ b/src/internal.c @@ -257,6 +257,9 @@ const char* GetErrorString(int err) case WS_SFTP_STATUS_NOT_OK: return "sftp status not OK"; + case WS_SFTP_FILE_DNE: + return "sftp file does not exist"; + default: return "Unknown error code"; } diff --git a/src/wolfsftp.c b/src/wolfsftp.c index c5345b5..c749746 100644 --- a/src/wolfsftp.c +++ b/src/wolfsftp.c @@ -6102,6 +6102,20 @@ 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; + FALL_THROUGH; + + case STATE_PUT_OPEN_LOCAL: + WLOG(WS_LOG_SFTP, "SFTP PUT STATE: OPEN LOCAL"); + ret = WFOPEN(&state->fl, from, "rb"); + if (ret != 0) { + WLOG(WS_LOG_SFTP, "Unable to open input file"); + ssh->error = WS_SFTP_FILE_DNE; + ret = WS_FATAL_ERROR; + state->state = STATE_PUT_CLEANUP; + continue; + } + state->rSz = 0; state->state = STATE_PUT_OPEN_REMOTE; FALL_THROUGH; @@ -6120,20 +6134,6 @@ int wolfSSH_SFTP_Put(WOLFSSH* ssh, char* from, char* to, byte resume, state->state = STATE_PUT_CLEANUP; continue; } - state->state = STATE_PUT_OPEN_LOCAL; - FALL_THROUGH; - - case STATE_PUT_OPEN_LOCAL: - WLOG(WS_LOG_SFTP, "SFTP PUT STATE: OPEN LOCAL"); - ret = WFOPEN(&state->fl, from, "rb"); - if (ret != 0) { - WLOG(WS_LOG_SFTP, "Unable to open input file"); - ssh->error = WS_BAD_FILE_E; - ret = WS_FATAL_ERROR; - state->state = STATE_PUT_CLEANUP; - continue; - } - state->rSz = 0; state->state = STATE_PUT_WRITE; FALL_THROUGH; diff --git a/wolfssh/error.h b/wolfssh/error.h index a487d62..ac565d7 100644 --- a/wolfssh/error.h +++ b/wolfssh/error.h @@ -100,8 +100,9 @@ enum WS_ErrorCodes { WS_SFTP_BAD_REQ_ID = -60, /* SFTP Bad request ID */ WS_SFTP_BAD_REQ_TYPE = -61, /* SFTP Bad request ID */ WS_SFTP_STATUS_NOT_OK = -62, /* SFTP Status not OK */ + WS_SFTP_FILE_DNE = -63, /* SFTP File Does Not Exist */ - WS_LAST_E = -62 /* Update this to indicate last error */ + WS_LAST_E = -63 /* Update this to indicate last error */ };