From e39d189d305a1b25a29c5eedb4124136f67fe020 Mon Sep 17 00:00:00 2001 From: JinmingHu Date: Fri, 28 May 2021 11:01:26 +0800 Subject: [PATCH] Use wide-char version of CreateFile API (#2343) * Use wide-char version of CreateFile API * fix * fix --- .../azure-storage-common/src/file_io.cpp | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/sdk/storage/azure-storage-common/src/file_io.cpp b/sdk/storage/azure-storage-common/src/file_io.cpp index e968d708b..75e6f6be4 100644 --- a/sdk/storage/azure-storage-common/src/file_io.cpp +++ b/sdk/storage/azure-storage-common/src/file_io.cpp @@ -22,9 +22,7 @@ #include #endif -#include #include -#include #include namespace Azure { namespace Storage { namespace _internal { @@ -32,12 +30,31 @@ namespace Azure { namespace Storage { namespace _internal { #if defined(AZ_PLATFORM_WINDOWS) FileReader::FileReader(const std::string& filename) { + int sizeNeeded = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, filename.data(), int(filename.length()), nullptr, 0); + if (sizeNeeded == 0) + { + throw std::runtime_error("invalid filename"); + } + std::wstring filenameW(sizeNeeded, L'\0'); + if (MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + filename.data(), + int(filename.length()), + &filenameW[0], + sizeNeeded) + == 0) + { + throw std::runtime_error("invalid filename"); + } + HANDLE fileHandle; #if !defined(WINAPI_PARTITION_DESKTOP) \ || WINAPI_PARTITION_DESKTOP // See azure/core/platform.hpp for explanation. - fileHandle = CreateFile( - filename.data(), + fileHandle = CreateFileW( + filenameW.data(), GENERIC_READ, FILE_SHARE_READ, nullptr, @@ -45,12 +62,7 @@ namespace Azure { namespace Storage { namespace _internal { FILE_ATTRIBUTE_NORMAL, NULL); #else - fileHandle = CreateFile2( - std::wstring_convert>().from_bytes(filename).c_str(), - GENERIC_READ, - FILE_SHARE_READ, - OPEN_EXISTING, - NULL); + fileHandle = CreateFile2(filenameW.data(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL); #endif if (fileHandle == INVALID_HANDLE_VALUE) { @@ -72,12 +84,31 @@ namespace Azure { namespace Storage { namespace _internal { FileWriter::FileWriter(const std::string& filename) { + int sizeNeeded = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, filename.data(), int(filename.length()), nullptr, 0); + if (sizeNeeded == 0) + { + throw std::runtime_error("invalid filename"); + } + std::wstring filenameW(sizeNeeded, L'\0'); + if (MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + filename.data(), + int(filename.length()), + &filenameW[0], + sizeNeeded) + == 0) + { + throw std::runtime_error("invalid filename"); + } + HANDLE fileHandle; #if !defined(WINAPI_PARTITION_DESKTOP) \ || WINAPI_PARTITION_DESKTOP // See azure/core/platform.hpp for explanation. - fileHandle = CreateFile( - filename.data(), + fileHandle = CreateFileW( + filenameW.data(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, @@ -86,11 +117,7 @@ namespace Azure { namespace Storage { namespace _internal { NULL); #else fileHandle = CreateFile2( - std::wstring_convert>().from_bytes(filename).c_str(), - GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - CREATE_ALWAYS, - NULL); + filenameW.data(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS, NULL); #endif if (fileHandle == INVALID_HANDLE_VALUE) {