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:
parent
bb9b88b70f
commit
1e55e30ff4
2 changed files with 7 additions and 1 deletions
|
@ -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.
|
** Returns a pointer to the buffer on success or 0 on error.
|
||||||
** The buffer is valid until you call Close() or Convert().
|
** The buffer is valid until you call Close() or Convert().
|
||||||
*/
|
*/
|
||||||
|
m_OptimizedReturn = false;
|
||||||
if ((size_t)-1 == cbSrc)
|
if ((size_t)-1 == cbSrc)
|
||||||
{
|
{
|
||||||
UINT cus = IsWE(m_FE) ? sizeof(wchar_t) : NStreamEncoding::GetCodeUnitSize(m_FE);
|
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;
|
if (cbSrc && ((WORD*)Src)[--cbSrc]) ++cbSrc;
|
||||||
*cbOut = cbSrc * sizeof(wchar_t);
|
*cbOut = cbSrc * sizeof(wchar_t);
|
||||||
}
|
}
|
||||||
|
m_OptimizedReturn = true;
|
||||||
return (void*) (m_Result = (char*) Src);
|
return (void*) (m_Result = (char*) Src);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -103,6 +103,7 @@ class CharEncConv {
|
||||||
WORD m_TE, m_FE;
|
WORD m_TE, m_FE;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
bool m_AllowOptimizedReturn; // Can Convert() return Src buffer?
|
bool m_AllowOptimizedReturn; // Can Convert() return Src buffer?
|
||||||
|
bool m_OptimizedReturn;
|
||||||
#else
|
#else
|
||||||
iconvdescriptor m_iconvd;
|
iconvdescriptor m_iconvd;
|
||||||
#endif
|
#endif
|
||||||
|
@ -115,7 +116,10 @@ public:
|
||||||
~CharEncConv() { Close(); }
|
~CharEncConv() { Close(); }
|
||||||
void Close()
|
void Close()
|
||||||
{
|
{
|
||||||
free(m_Result);
|
#ifdef _WIN32
|
||||||
|
if (!m_OptimizedReturn)
|
||||||
|
#endif
|
||||||
|
free(m_Result);
|
||||||
m_Result = 0;
|
m_Result = 0;
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
m_iconvd.Close();
|
m_iconvd.Close();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue