diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2014-05-17 17:02:11 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2014-05-17 17:02:11 +0400 |
commit | 836874f9d44011de1bc8427d24bdba725db53ca3 (patch) | |
tree | 995f1943147d63155fa94d33c7c37499cbc7907e /common | |
parent | 4e07f66d26c4e8a6f392378f5009016607dac752 (diff) |
Fix safe conversions functions in the case of too long inputs
Diffstat (limited to 'common')
-rw-r--r-- | common/DSUtilLite/DShowUtil.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/common/DSUtilLite/DShowUtil.cpp b/common/DSUtilLite/DShowUtil.cpp index b69f70a2..8d39c716 100644 --- a/common/DSUtilLite/DShowUtil.cpp +++ b/common/DSUtilLite/DShowUtil.cpp @@ -188,8 +188,12 @@ std::wstring WStringFromGUID(const GUID& guid) int SafeMultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar) { int len = MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar); - if (len == cchWideChar) { - lpWideCharStr[len - 1] = 0; + if (cchWideChar) { + if (len == cchWideChar || (len == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { + lpWideCharStr[cchWideChar - 1] = 0; + } else if (len == 0) { + lpWideCharStr[0] = 0; + } } return len; } @@ -197,8 +201,12 @@ int SafeMultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int SafeWideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar) { int len = WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar); - if (len == cbMultiByte) { - lpMultiByteStr[len - 1] = 0; + if (cbMultiByte) { + if (len == cbMultiByte || (len == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { + lpMultiByteStr[cbMultiByte - 1] = 0; + } else if (len == 0) { + lpMultiByteStr[0] = 0; + } } return len; } |