SFTP List

Fixes listing the contents of C:\ on Windows when running the wolfSFTP
server. (ZD14607)

1. Change RecvOpenDir to look up the directory the way SFTPNAME_readdir.
2. Removed the calls to CleanPath in RecvOpenDir and SFTPNAME_readdir as
   it was adding backslashes to the dirName.
pull/436/head
John Safranek 2022-08-12 14:55:09 -07:00
parent cace79e915
commit 2be99a25f6
No known key found for this signature in database
GPG Key ID: 8CE817DE0D3CCB4A
1 changed files with 12 additions and 12 deletions

View File

@ -2275,6 +2275,7 @@ int wolfSSH_SFTP_RecvOpenDir(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
byte* out = NULL;
word32 id[2];
byte idFlat[sizeof(word32) * 2];
char name[MAX_PATH];
if (ssh == NULL) {
return WS_BAD_ARGUMENT;
@ -2301,13 +2302,16 @@ int wolfSSH_SFTP_RecvOpenDir(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
}
WMEMCPY(dirName, data + idx, sz);
dirName[sz] = '\0';
if (wolfSSH_CleanPath(ssh, dirName) < 0) {
WFREE(dirName, ssh->ctx->heap, DYNTYPE_BUFFER);
if (sz > MAX_PATH - 2) {
WLOG(WS_LOG_SFTP, "Path name is too long.");
return WS_FATAL_ERROR;
}
WSTRNCPY(name, dirName, MAX_PATH);
WSTRNCAT(name, "/*", MAX_PATH);
/* get directory handle */
findHandle = (HANDLE)WS_FindFirstFileA(dirName,
/* get directory handle - see if directory exists */
findHandle = (HANDLE)WS_FindFirstFileA(name,
realName, sizeof(realName), &isDir, ssh->ctx->heap);
if (findHandle == INVALID_HANDLE_VALUE || !isDir) {
@ -2321,7 +2325,8 @@ int wolfSSH_SFTP_RecvOpenDir(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
}
ret = WS_BAD_FILE_E;
}
FindClose(findHandle);
if (findHandle != NULL && findHandle != INVALID_HANDLE_VALUE)
FindClose(findHandle);
(void)reqId;
@ -2707,12 +2712,12 @@ static int wolfSSH_SFTPNAME_readdir(WOLFSSH* ssh, WDIR* dir, WS_SFTPNAME* out,
char name[MAX_PATH];
word32 nameLen = (word32)WSTRLEN(dirName);
if (nameLen > MAX_PATH - 3) {
if (nameLen > MAX_PATH - 2) {
WLOG(WS_LOG_SFTP, "Path name is too long.");
return WS_FATAL_ERROR;
}
WSTRNCPY(name, dirName, MAX_PATH);
WSTRNCAT(name, "\\*", MAX_PATH);
WSTRNCAT(name, "/*", MAX_PATH);
findHandle = (HANDLE)WS_FindFirstFileA(name,
realFileName, sizeof(realFileName), NULL, ssh->ctx->heap);
@ -2761,11 +2766,6 @@ static int wolfSSH_SFTPNAME_readdir(WOLFSSH* ssh, WDIR* dir, WS_SFTPNAME* out,
}
WSTRNCAT(buf, out->fName, bufSz + 1);
if (wolfSSH_CleanPath(ssh, buf) < 0) {
WFREE(buf, out->heap, DYNTYPE_SFTP);
return WS_FATAL_ERROR;
}
if (SFTP_GetAttributes(ssh->fs, buf, &out->atrb, 0, ssh->ctx->heap)
!= WS_SUCCESS) {
WLOG(WS_LOG_SFTP, "Unable to get attribute values for %s",