From c9b42a87ec01b0a8835047ab236c230a51b24e68 Mon Sep 17 00:00:00 2001 From: Hendrik Leppkes Date: Mon, 12 May 2014 16:29:55 +0200 Subject: Check all uses of MultiByteToWideChar and WideCharToMultiByte Fixes issue 452. --- demuxer/Demuxers/BDDemuxer.cpp | 4 ++-- demuxer/Demuxers/LAVFDemuxer.cpp | 8 +++----- demuxer/Demuxers/LAVFStreamInfo.cpp | 2 +- demuxer/LAVSplitter/LAVSplitter.cpp | 30 +++++++++--------------------- 4 files changed, 15 insertions(+), 29 deletions(-) (limited to 'demuxer') diff --git a/demuxer/Demuxers/BDDemuxer.cpp b/demuxer/Demuxers/BDDemuxer.cpp index 0e439816..be8e78a0 100644 --- a/demuxer/Demuxers/BDDemuxer.cpp +++ b/demuxer/Demuxers/BDDemuxer.cpp @@ -96,7 +96,7 @@ static void bd_log(const char *log) { if (log[len-1] == '\n') { len--; } - MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, log, (int)len, line, 4096); + SafeMultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, log, (int)len, line, 4096); DbgLog((LOG_TRACE, 40, L"[BD] %s", line)); } #endif @@ -161,7 +161,7 @@ STDMETHODIMP CBDDemuxer::Open(LPCOLESTR pszFileName) // Convert the filename from wchar to char for libbluray char fileName[4096]; - ret = WideCharToMultiByte(CP_UTF8, 0, pszFileName, -1, fileName, 4096, nullptr, nullptr); + ret = SafeWideCharToMultiByte(CP_UTF8, 0, pszFileName, -1, fileName, 4096, nullptr, nullptr); int iPlaylist = -1; diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 3d08905f..74b51390 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -191,7 +191,7 @@ STDMETHODIMP CLAVFDemuxer::OpenInputStream(AVIOContext *byteContext, LPCOLESTR p // Convert the filename from wchar to char for avformat char fileName[4100] = {0}; if (pszFileName) { - ret = WideCharToMultiByte(CP_UTF8, 0, pszFileName, -1, fileName, 4096, nullptr, nullptr); + ret = SafeWideCharToMultiByte(CP_UTF8, 0, pszFileName, -1, fileName, 4096, nullptr, nullptr); } if (_strnicmp("mms:", fileName, 4) == 0) { @@ -684,9 +684,7 @@ STDMETHODIMP CLAVFDemuxer::GetTitleInfo(int idx, REFERENCE_TIME *rtDuration, WCH } else { title = av_asprintf("E: Edition %d [%02d:%02d:%02d]", idx+1, hours, minutes, seconds); } - size_t len = strlen(title); - *ppszName = (WCHAR *)CoTaskMemAlloc(sizeof(WCHAR) * (len + 1)); - MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, title, -1, *ppszName, len+1); + *ppszName = CoTaskGetWideCharFromMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, title, -1); av_freep(&title); } return S_OK; @@ -1265,7 +1263,7 @@ STDMETHODIMP CLAVFDemuxer::GetMarkerName(long MarkerNum, BSTR* pbstrMarkerName) OLECHAR wTitle[128]; if (AVDictionaryEntry *dictEntry = av_dict_get(m_avFormat->chapters[index]->metadata, "title", nullptr, 0)) { char *title = dictEntry->value; - MultiByteToWideChar(CP_UTF8, 0, title, -1, wTitle, 128); + SafeMultiByteToWideChar(CP_UTF8, 0, title, -1, wTitle, 128); } else { swprintf_s(wTitle, L"Chapter %d", MarkerNum); } diff --git a/demuxer/Demuxers/LAVFStreamInfo.cpp b/demuxer/Demuxers/LAVFStreamInfo.cpp index 0c4d4b52..3e385909 100644 --- a/demuxer/Demuxers/LAVFStreamInfo.cpp +++ b/demuxer/Demuxers/LAVFStreamInfo.cpp @@ -451,7 +451,7 @@ STDMETHODIMP CLAVFStreamInfo::CreateSubtitleMediaType(AVFormatContext *avctx, AV // read metadata char *title = dictEntry->value; // convert to wchar - MultiByteToWideChar(CP_UTF8, 0, title, -1, subInfo->TrackName, 256); + SafeMultiByteToWideChar(CP_UTF8, 0, title, -1, subInfo->TrackName, 256); } subInfo->dwOffset = sizeof(SUBTITLEINFO); diff --git a/demuxer/LAVSplitter/LAVSplitter.cpp b/demuxer/LAVSplitter/LAVSplitter.cpp index 6340e86d..d28de250 100644 --- a/demuxer/LAVSplitter/LAVSplitter.cpp +++ b/demuxer/LAVSplitter/LAVSplitter.cpp @@ -237,7 +237,7 @@ STDMETHODIMP CLAVSplitter::ReadSettings(HKEY rootKey) if (SUCCEEDED(hr)) { WCHAR wBuffer[80]; for (const FormatInfo& fmt : m_InputFormats) { - MultiByteToWideChar(CP_UTF8, 0, fmt.strName, -1, wBuffer, 80); + SafeMultiByteToWideChar(CP_UTF8, 0, fmt.strName, -1, wBuffer, 80); bFlag = regF.ReadBOOL(wBuffer, hr); if (SUCCEEDED(hr)) m_settings.formats[std::string(fmt.strName)] = bFlag; } @@ -280,7 +280,7 @@ STDMETHODIMP CLAVSplitter::SaveSettings() if (SUCCEEDED(hr)) { WCHAR wBuffer[80]; for (const FormatInfo& fmt : m_InputFormats) { - MultiByteToWideChar(CP_UTF8, 0, fmt.strName, -1, wBuffer, 80); + SafeMultiByteToWideChar(CP_UTF8, 0, fmt.strName, -1, wBuffer, 80); regF.WriteBOOL(wBuffer, m_settings.formats[std::string(fmt.strName)]); } } @@ -1368,10 +1368,7 @@ STDMETHODIMP CLAVSplitter::Info(long lIndex, AM_MEDIA_TYPE **ppmt, DWORD *pdwFla } if (ppszName) { std::string info = s.streamInfo->codecInfo; - size_t len = info.size() + 1; - *ppszName = (WCHAR*)CoTaskMemAlloc(len * sizeof(WCHAR)); - if (*ppszName) - MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, info.c_str(), -1, *ppszName, (int)len); + *ppszName = CoTaskGetWideCharFromMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, info.c_str(), -1); } } hr = S_OK; @@ -1403,15 +1400,12 @@ std::list CLAVSplitter::GetPreferredAudioLanguageList() { std::list list; - // Convert to multi-byte ascii - int bufSize = (int)(sizeof(WCHAR) * (m_settings.prefAudioLangs.length() + 1)); - char *buffer = (char *)CoTaskMemAlloc(bufSize); + char *buffer = CoTaskGetMultiByteFromWideChar(CP_UTF8, 0, m_settings.prefAudioLangs.c_str(), -1); if (!buffer) return list; - WideCharToMultiByte(CP_UTF8, 0, m_settings.prefAudioLangs.c_str(), -1, buffer, bufSize, nullptr, nullptr); split(std::string(buffer), std::string(",; "), list); - CoTaskMemFree(buffer); + SAFE_CO_FREE(buffer); return list; } @@ -1426,13 +1420,10 @@ std::list CLAVSplitter::GetSubtitleSelectors() if (m_settings.subtitleMode == LAVSubtitleMode_NoSubs) { // Do nothing } else if (m_settings.subtitleMode == LAVSubtitleMode_Default || m_settings.subtitleMode == LAVSubtitleMode_ForcedOnly) { - // Convert to multi-byte ascii - size_t bufSize = sizeof(WCHAR) * (m_settings.prefSubLangs.length() + 1); - char *buffer = (char *)CoTaskMemAlloc(bufSize); + // Convert to wide-char to utf8 + char *buffer = CoTaskGetMultiByteFromWideChar(CP_UTF8, 0, m_settings.prefSubLangs.c_str(), -1); if (!buffer) return selectorList; - ZeroMemory(buffer, bufSize); - WideCharToMultiByte(CP_UTF8, 0, m_settings.prefSubLangs.c_str(), -1, buffer, (int)bufSize, nullptr, nullptr); std::list langList; split(std::string(buffer), separators, langList); @@ -1462,13 +1453,10 @@ std::list CLAVSplitter::GetSubtitleSelectors() if (m_settings.subtitleMode == LAVSubtitleMode_Default) tokenList.push_back("*:*|d"); } else if (m_settings.subtitleMode == LAVSubtitleMode_Advanced) { - // Convert to multi-byte ascii - size_t bufSize = sizeof(WCHAR) * (m_settings.subtitleAdvanced.length() + 1); - char *buffer = (char *)CoTaskMemAlloc(bufSize); + // Convert to wide-char to utf8 + char *buffer = CoTaskGetMultiByteFromWideChar(CP_UTF8, 0, m_settings.subtitleAdvanced.c_str(), -1); if (!buffer) return selectorList; - ZeroMemory(buffer, bufSize); - WideCharToMultiByte(CP_UTF8, 0, m_settings.subtitleAdvanced.c_str(), -1, buffer, (int)bufSize, nullptr, nullptr); split(std::string(buffer), separators, tokenList); SAFE_CO_FREE(buffer); -- cgit v1.2.3