diff --git a/src/port.c b/src/port.c index 5920c64..cd4976b 100644 --- a/src/port.c +++ b/src/port.c @@ -161,7 +161,7 @@ void* WS_CreateFileA(const char* fileName, unsigned long desiredAccess, fileHandle = CreateFileW(unicodeFileName, desiredAccess, shareMode, NULL, creationDisposition, flags, NULL); - WFREE(unicodeFileName, heap, 0); + WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING); return (void*)(error ? INVALID_HANDLE_VALUE : fileHandle); } @@ -193,7 +193,7 @@ void* WS_FindFirstFileA(const char* fileName, if (!error) findHandle = FindFirstFileW(unicodeFileName, &findFileData); - WFREE(unicodeFileName, heap, 0); + WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING); error = wcstombs_s(NULL, realFileName, realFileNameSz, findFileData.cFileName, realFileNameSz); @@ -252,11 +252,160 @@ int WS_GetFileAttributesExA(const char* fileName, void* fileInfo, void* heap) GetFileExInfoStandard, fileInfo); } - WFREE(unicodeFileName, heap, 0); + WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING); return success != 0; } + +int WS_RemoveDirectoryA(const char* dirName, void* heap) +{ + BOOL success = 0; + wchar_t* unicodeDirName; + size_t unicodeDirNameSz = 0; + size_t returnSz = 0; + size_t dirNameSz = 0; + errno_t error; + + dirNameSz = WSTRLEN(dirName); + error = mbstowcs_s(&unicodeDirNameSz, NULL, 0, dirName, 0); + if (error != 0) + return 0; + + unicodeDirName = (wchar_t*)WMALLOC((unicodeDirNameSz+1)*sizeof(wchar_t), + heap, PORT_DYNTYPE_STRING); + if (unicodeDirName == NULL) + return 0; + + error = mbstowcs_s(&returnSz, unicodeDirName, unicodeDirNameSz, + dirName, dirNameSz); + + if (error == 0) { + success = RemoveDirectoryW(unicodeDirName); + } + + WFREE(unicodeDirName, heap, PORT_DYNTYPE_STRING); + + return success != 0; +} + + +int WS_CreateDirectoryA(const char* dirName, void* heap) +{ + BOOL success = 0; + wchar_t* unicodeDirName; + size_t unicodeDirNameSz = 0; + size_t returnSz = 0; + size_t dirNameSz = 0; + errno_t error; + + dirNameSz = WSTRLEN(dirName); + error = mbstowcs_s(&unicodeDirNameSz, NULL, 0, dirName, 0); + if (error != 0) + return 0; + + unicodeDirName = (wchar_t*)WMALLOC((unicodeDirNameSz+1)*sizeof(wchar_t), + heap, PORT_DYNTYPE_STRING); + if (unicodeDirName == NULL) + return 0; + + error = mbstowcs_s(&returnSz, unicodeDirName, unicodeDirNameSz, + dirName, dirNameSz); + + if (error == 0) { + success = CreateDirectoryW(unicodeDirName, NULL); + } + + WFREE(unicodeDirName, heap, PORT_DYNTYPE_STRING); + + return success != 0; +} + + +int WS_MoveFileA(const char* oldName, const char* newName, void* heap) +{ + BOOL success = 0; + wchar_t* unicodeOldName; + wchar_t* unicodeNewName; + size_t unicodeOldNameSz = 0; + size_t unicodeNewNameSz = 0; + size_t oldNameSz = 0; + size_t newNameSz = 0; + size_t returnSz = 0; + errno_t error; + + oldNameSz = WSTRLEN(oldName); + + error = mbstowcs_s(&unicodeOldNameSz, NULL, 0, oldName, 0); + if (error != 0) + return 0; + + unicodeOldName = (wchar_t*)WMALLOC((unicodeOldNameSz+1)*sizeof(wchar_t), + heap, PORT_DYNTYPE_STRING); + if (unicodeOldName == NULL) + return 0; + + error = mbstowcs_s(&returnSz, unicodeOldName, unicodeOldNameSz, + oldName, oldNameSz); + + newNameSz = WSTRLEN(newName); + error = mbstowcs_s(&unicodeNewNameSz, NULL, 0, newName, 0); + if (error != 0) + return 0; + + unicodeNewName = (wchar_t*)WMALLOC((unicodeNewNameSz+1)*sizeof(wchar_t), + heap, PORT_DYNTYPE_STRING); + if (unicodeNewName == NULL) { + WFREE(unicodeOldName, heap, PORT_DYNTYPE_STRING); + return 0; + } + + error = mbstowcs_s(&returnSz, unicodeNewName, unicodeNewNameSz, + newName, newNameSz); + + if (error == 0) { + success = MoveFileW(unicodeOldName, unicodeNewName); + } + + WFREE(unicodeOldName, heap, PORT_DYNTYPE_STRING); + WFREE(unicodeNewName, heap, PORT_DYNTYPE_STRING); + + return success != 0; +} + + +int WS_DeleteFileA(const char* fileName, void* heap) +{ + BOOL success = 0; + wchar_t* unicodeFileName; + size_t unicodeFileNameSz = 0; + size_t returnSz = 0; + size_t fileNameSz = 0; + errno_t error; + + fileNameSz = WSTRLEN(fileName); + error = mbstowcs_s(&unicodeFileNameSz, NULL, 0, fileName, 0); + if (error != 0) + return 0; + + unicodeFileName = (wchar_t*)WMALLOC((unicodeFileNameSz+1)*sizeof(wchar_t), + heap, PORT_DYNTYPE_STRING); + if (unicodeFileName == NULL) + return 0; + + error = mbstowcs_s(&returnSz, unicodeFileName, unicodeFileNameSz, + fileName, fileNameSz); + + if (error == 0) { + success = DeleteFileW(unicodeFileName); + } + + WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING); + + return success != 0; +} + + #endif /* USE_WINDOWS_API */ diff --git a/src/wolfsftp.c b/src/wolfsftp.c index 98b05f6..05d17d8 100644 --- a/src/wolfsftp.c +++ b/src/wolfsftp.c @@ -1299,7 +1299,7 @@ int wolfSSH_SFTP_RecvRMDIR(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz) #ifndef USE_WINDOWS_API ret = WRMDIR(dir); #else /* USE_WINDOWS_API */ - ret = RemoveDirectoryA(dir) == 0; + ret = WS_RemoveDirectoryA(dir, ssh->ctx->heap) == 0; #endif /* USE_WINDOWS_API */ WFREE(dir, ssh->ctx->heap, DYNTYPE_BUFFER); @@ -1394,7 +1394,7 @@ int wolfSSH_SFTP_RecvMKDIR(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz) #ifndef USE_WINDOWS_API ret = WMKDIR(dir, mode); #else /* USE_WINDOWS_API */ - ret = CreateDirectoryA(dir, NULL) == 0; + ret = WS_CreateDirectoryA(dir, ssh->ctx->heap) == 0; #endif /* USE_WINDOWS_API */ WFREE(dir, ssh->ctx->heap, DYNTYPE_BUFFER); @@ -3001,7 +3001,12 @@ int wolfSSH_SFTP_RecvRemove(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz) name[sz] = '\0'; clean_path(name); - if ((ret = WREMOVE(name)) < 0) { +#ifndef USE_WINDOWS_API + if ((ret = WREMOVE(name)) < 0) +#else /* USE_WINDOWS_API */ + if (WS_DeleteFileA(name, ssh->ctx->heap) == 0) +#endif /* USE_WINDOWS_API */ + { WLOG(WS_LOG_SFTP, "Error removing file"); #if defined(WOLFSSL_NUCLEUS) && defined(DEBUG_WOLFSSH) if (ret == NUF_ACCES) @@ -3100,9 +3105,16 @@ int wolfSSH_SFTP_RecvRename(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz) clean_path(old); clean_path(nw); - if (ret == WS_SUCCESS && WRENAME(old, nw) < 0) { - WLOG(WS_LOG_SFTP, "Error renaming file"); - ret = WS_BAD_FILE_E; + if (ret == WS_SUCCESS) { + #ifndef USE_WINDOWS_API + if (WRENAME(old, nw) < 0) + #else /* USE_WINDOWS_API */ + if (WS_MoveFileA(old, nw, ssh->ctx->heap) == 0) + #endif /* USE_WINDOWS_API */ + { + WLOG(WS_LOG_SFTP, "Error renaming file"); + ret = WS_BAD_FILE_E; + } } /* Let the client know the results from trying to rename the file */ diff --git a/wolfssh/port.h b/wolfssh/port.h index 43f67db..84e1b09 100644 --- a/wolfssh/port.h +++ b/wolfssh/port.h @@ -160,6 +160,14 @@ extern "C" { char* realFileName, size_t realFileNameSz); WOLFSSH_LOCAL int WS_GetFileAttributesExA(const char* fileName, void* fileInfo, void* heap); + WOLFSSH_LOCAL int WS_RemoveDirectoryA(const char* dirName, + void* heap); + WOLFSSH_LOCAL int WS_CreateDirectoryA(const char* dirName, + void* heap); + WOLFSSH_LOCAL int WS_MoveFileA(const char* oldName, + const char* newName, void* heap); + WOLFSSH_LOCAL int WS_DeleteFileA(const char* fileName, + void* heap); #ifndef _WIN32_WCE #include