Optimized return is valid even after the CharEncConv object is destroyed

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6415 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2013-10-09 00:16:28 +00:00
parent bb9b88b70f
commit 1e55e30ff4
2 changed files with 7 additions and 1 deletions

View file

@ -154,6 +154,7 @@ void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut)
** Returns a pointer to the buffer on success or 0 on error.
** The buffer is valid until you call Close() or Convert().
*/
m_OptimizedReturn = false;
if ((size_t)-1 == cbSrc)
{
UINT cus = IsWE(m_FE) ? sizeof(wchar_t) : NStreamEncoding::GetCodeUnitSize(m_FE);
@ -184,6 +185,7 @@ void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut)
if (cbSrc && ((WORD*)Src)[--cbSrc]) ++cbSrc;
*cbOut = cbSrc * sizeof(wchar_t);
}
m_OptimizedReturn = true;
return (void*) (m_Result = (char*) Src);
}
#endif

View file

@ -103,6 +103,7 @@ class CharEncConv {
WORD m_TE, m_FE;
#ifdef _WIN32
bool m_AllowOptimizedReturn; // Can Convert() return Src buffer?
bool m_OptimizedReturn;
#else
iconvdescriptor m_iconvd;
#endif
@ -115,7 +116,10 @@ public:
~CharEncConv() { Close(); }
void Close()
{
free(m_Result);
#ifdef _WIN32
if (!m_OptimizedReturn)
#endif
free(m_Result);
m_Result = 0;
#ifndef _WIN32
m_iconvd.Close();