diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2014-02-20 20:46:23 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2014-02-20 20:46:23 +0000 |
commit | 225d1f3c6a0c15b679308b2813c499f892499a13 (patch) | |
tree | 3e74b4843497b39d57c19e045ce123b8afdabd12 | |
parent | 22559cc0994c6bd7cabbe4e234be183a067b933b (diff) | |
download | llvm-225d1f3c6a0c15b679308b2813c499f892499a13.tar.gz llvm-225d1f3c6a0c15b679308b2813c499f892499a13.tar.bz2 llvm-225d1f3c6a0c15b679308b2813c499f892499a13.tar.xz |
[Support] Correctly handle zero length inputs to UTF conversion functions on Windows.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201811 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Support/Windows/Path.inc | 62 |
1 files changed, 30 insertions, 32 deletions
diff --git a/lib/Support/Windows/Path.inc b/lib/Support/Windows/Path.inc index 4c51c4401f..fa7d18a711 100644 --- a/lib/Support/Windows/Path.inc +++ b/lib/Support/Windows/Path.inc @@ -1040,22 +1040,22 @@ bool home_directory(SmallVectorImpl<char> &result) { namespace windows { llvm::error_code UTF8ToUTF16(llvm::StringRef utf8, llvm::SmallVectorImpl<wchar_t> &utf16) { - int len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, - utf8.begin(), utf8.size(), - utf16.begin(), 0); + if (!utf8.empty()) { + int len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, utf8.begin(), + utf8.size(), utf16.begin(), 0); - if (len == 0) - return llvm::windows_error(::GetLastError()); + if (len == 0) + return llvm::windows_error(::GetLastError()); - utf16.reserve(len + 1); - utf16.set_size(len); + utf16.reserve(len + 1); + utf16.set_size(len); - len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, - utf8.begin(), utf8.size(), - utf16.begin(), utf16.size()); + len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, utf8.begin(), + utf8.size(), utf16.begin(), utf16.size()); - if (len == 0) - return llvm::windows_error(::GetLastError()); + if (len == 0) + return llvm::windows_error(::GetLastError()); + } // Make utf16 null terminated. utf16.push_back(0); @@ -1066,26 +1066,24 @@ llvm::error_code UTF8ToUTF16(llvm::StringRef utf8, llvm::error_code UTF16ToUTF8(const wchar_t *utf16, size_t utf16_len, llvm::SmallVectorImpl<char> &utf8) { - // Get length. - int len = ::WideCharToMultiByte(CP_UTF8, 0, - utf16, utf16_len, - utf8.begin(), 0, - NULL, NULL); - - if (len == 0) - return llvm::windows_error(::GetLastError()); - - utf8.reserve(len); - utf8.set_size(len); - - // Now do the actual conversion. - len = ::WideCharToMultiByte(CP_UTF8, 0, - utf16, utf16_len, - utf8.data(), utf8.size(), - NULL, NULL); - - if (len == 0) - return llvm::windows_error(::GetLastError()); + if (utf16_len) { + // Get length. + int len = ::WideCharToMultiByte(CP_UTF8, 0, utf16, utf16_len, utf8.begin(), + 0, NULL, NULL); + + if (len == 0) + return llvm::windows_error(::GetLastError()); + + utf8.reserve(len); + utf8.set_size(len); + + // Now do the actual conversion. + len = ::WideCharToMultiByte(CP_UTF8, 0, utf16, utf16_len, utf8.data(), + utf8.size(), NULL, NULL); + + if (len == 0) + return llvm::windows_error(::GetLastError()); + } // Make utf8 null terminated. utf8.push_back(0); |