From d02935808605803b51b6b533b9943bf1e3d370a4 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Tue, 27 Sep 2016 11:42:49 +0200 Subject: [PATCH] Excess terminator in WideCharToMultiByte<>() fixed --- include/WinStd/Win.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/WinStd/Win.h b/include/WinStd/Win.h index fcf00cce..59209fbe 100644 --- a/include/WinStd/Win.h +++ b/include/WinStd/Win.h @@ -1169,13 +1169,13 @@ inline int MultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_cou int cch = ::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer)); if (cch) { // Copy from stack. - sWideCharStr.assign(szStackBuffer, cch); + sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : cch - 1); } else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // Query the required output size. Allocate buffer. Then convert again. cch = ::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, NULL, 0); auto szBuffer = std::unique_ptr<_Elem[]>(new _Elem[cch]); cch = ::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szBuffer.get(), cch); - sWideCharStr.assign(szBuffer.get(), cch); + sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : cch - 1); } return cch;