From 1e55e30ff4c8d383797e54b8ad4f1ea11d00f919 Mon Sep 17 00:00:00 2001 From: anders_k Date: Wed, 9 Oct 2013 00:16:28 +0000 Subject: [PATCH] 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 --- Source/utf.cpp | 2 ++ Source/utf.h | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/utf.cpp b/Source/utf.cpp index 1a300927..20a7a2bc 100644 --- a/Source/utf.cpp +++ b/Source/utf.cpp @@ -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 diff --git a/Source/utf.h b/Source/utf.h index cfb4e6bd..b5d7a68d 100644 --- a/Source/utf.h +++ b/Source/utf.h @@ -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();