Merge pull request #87 from JacobBarthelmeh/testing

fix for recursive scp case
pull/88/head
Chris Conlon 2018-08-07 16:49:39 -06:00 committed by GitHub
commit cea5d5664e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 6 deletions

View File

@ -1074,15 +1074,24 @@ static int ParseBasePathHelper(WOLFSSH* ssh, int cmdSz)
} }
sz = sz - idx; /* size of file name */ 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); DYNTYPE_STRING);
if (ssh->scpFileName == NULL) { if (ssh->scpFileName == NULL) {
WLOG(WS_LOG_DEBUG, "scp: memory error creaating file name\n"); WLOG(WS_LOG_DEBUG, "scp: memory error creaating file name\n");
ssh->scpBasePath = NULL; ssh->scpBasePath = NULL;
return WS_MEMORY_E; return WS_MEMORY_E;
}
} }
ssh->scpFileReName = ssh->scpFileName;
WSTRNCPY(ssh->scpFileName, ssh->scpBasePath + idx, sz); WSTRNCPY(ssh->scpFileName, ssh->scpBasePath + idx, sz);
ssh->scpFileName[sz] = '\0'; ssh->scpFileName[sz] = '\0';
ssh->scpFileNameSz = sz;
*((char*)ssh->scpBasePath + idx) = '\0'; *((char*)ssh->scpBasePath + idx) = '\0';
} }
else { else {
@ -1235,9 +1244,12 @@ int ReceiveScpMessage(WOLFSSH* ssh)
if ((ret = GetScpFileSize(ssh, buf, sz, &idx)) != WS_SUCCESS) if ((ret = GetScpFileSize(ssh, buf, sz, &idx)) != WS_SUCCESS)
break; break;
if (ssh->scpFileName == NULL) { if (ssh->scpFileReName == NULL) {
ret = GetScpFileName(ssh, buf, sz, &idx); ret = GetScpFileName(ssh, buf, sz, &idx);
} }
else {
ssh->scpFileReName = NULL;
}
break; break;
case 'E': case 'E':

View File

@ -296,6 +296,7 @@ struct WOLFSSH {
int scpFileMode; /* mode/permission of file/dir */ int scpFileMode; /* mode/permission of file/dir */
word32 scpFileSz; /* total size of file/dir being transferred */ word32 scpFileSz; /* total size of file/dir being transferred */
char* scpFileName; /* file name, dynamic */ char* scpFileName; /* file name, dynamic */
char* scpFileReName; /* file rename case, points to scpFileName */
word32 scpFileNameSz; /* length of fileName, not including \0 */ word32 scpFileNameSz; /* length of fileName, not including \0 */
byte scpTimestamp; /* did peer request timestamp? {0:1} */ byte scpTimestamp; /* did peer request timestamp? {0:1} */
word64 scpATime; /* scp file access time, secs since epoch */ word64 scpATime; /* scp file access time, secs since epoch */