From 9d6d975700b341b97fe2b93324bb7c30d5bf15d2 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Tue, 7 Aug 2018 13:18:48 -0600 Subject: [PATCH] fix for recursive scp case --- src/wolfscp.c | 24 ++++++++++++++++++------ wolfssh/internal.h | 1 + 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/wolfscp.c b/src/wolfscp.c index 93b10863..33b2dfde 100644 --- a/src/wolfscp.c +++ b/src/wolfscp.c @@ -1074,15 +1074,24 @@ static int ParseBasePathHelper(WOLFSSH* ssh, int cmdSz) } sz = sz - idx; /* size of file name */ - ssh->scpFileName = (char*)WMALLOC(sz + 1, ssh->ctx->heap, + if (ssh->scpFileNameSz < (word32)sz || ssh->scpFileName == NULL) { + if (ssh->scpFileName != NULL) { + WFREE(ssh->scpFileName, ssh->ctx->heap, DYNTYPE_STRING); + ssh->scpFileNameSz = 0; + } + ssh->scpFileName = (char*)WMALLOC(sz + 1, ssh->ctx->heap, DYNTYPE_STRING); - if (ssh->scpFileName == NULL) { - WLOG(WS_LOG_DEBUG, "scp: memory error creaating file name\n"); - ssh->scpBasePath = NULL; - return WS_MEMORY_E; + if (ssh->scpFileName == NULL) { + WLOG(WS_LOG_DEBUG, "scp: memory error creaating file name\n"); + ssh->scpBasePath = NULL; + return WS_MEMORY_E; + } } + + ssh->scpFileReName = ssh->scpFileName; WSTRNCPY(ssh->scpFileName, ssh->scpBasePath + idx, sz); ssh->scpFileName[sz] = '\0'; + ssh->scpFileNameSz = sz; *((char*)ssh->scpBasePath + idx) = '\0'; } else { @@ -1235,9 +1244,12 @@ int ReceiveScpMessage(WOLFSSH* ssh) if ((ret = GetScpFileSize(ssh, buf, sz, &idx)) != WS_SUCCESS) break; - if (ssh->scpFileName == NULL) { + if (ssh->scpFileReName == NULL) { ret = GetScpFileName(ssh, buf, sz, &idx); } + else { + ssh->scpFileReName = NULL; + } break; case 'E': diff --git a/wolfssh/internal.h b/wolfssh/internal.h index ac587afc..f1360826 100644 --- a/wolfssh/internal.h +++ b/wolfssh/internal.h @@ -296,6 +296,7 @@ struct WOLFSSH { int scpFileMode; /* mode/permission of file/dir */ word32 scpFileSz; /* total size of file/dir being transferred */ char* scpFileName; /* file name, dynamic */ + char* scpFileReName; /* file rename case, points to scpFileName */ word32 scpFileNameSz; /* length of fileName, not including \0 */ byte scpTimestamp; /* did peer request timestamp? {0:1} */ word64 scpATime; /* scp file access time, secs since epoch */