don't crash if (char*)c_str() is used twice in a row on the same string and both pointers are used at the same time
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45389 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
dc3065a56f
commit
05f32fc39e
@ -2010,7 +2010,7 @@ private:
|
|||||||
~ConvertedBuffer()
|
~ConvertedBuffer()
|
||||||
{ free(m_buf); }
|
{ free(m_buf); }
|
||||||
|
|
||||||
operator const T*() const { return m_buf; }
|
operator T*() const { return m_buf; }
|
||||||
|
|
||||||
ConvertedBuffer& operator=(T *str)
|
ConvertedBuffer& operator=(T *str)
|
||||||
{
|
{
|
||||||
|
@ -198,8 +198,24 @@ wxString::~wxString()
|
|||||||
const char* wxCStrData::AsChar() const
|
const char* wxCStrData::AsChar() const
|
||||||
{
|
{
|
||||||
wxString *str = wxConstCast(m_str, wxString);
|
wxString *str = wxConstCast(m_str, wxString);
|
||||||
// convert the string and keep it:
|
|
||||||
str->m_convertedToChar = str->mb_str().release();
|
// convert the string:
|
||||||
|
wxCharBuffer buf(str->mb_str());
|
||||||
|
|
||||||
|
// FIXME-UTF8: do the conversion in-place in the existing buffer
|
||||||
|
if ( str->m_convertedToChar &&
|
||||||
|
strlen(buf) == strlen(str->m_convertedToChar) )
|
||||||
|
{
|
||||||
|
// keep the same buffer for as long as possible, so that several calls
|
||||||
|
// to c_str() in a row still work:
|
||||||
|
strcpy(str->m_convertedToChar, buf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str->m_convertedToChar = buf.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
// and keep it:
|
||||||
return str->m_convertedToChar + m_offset;
|
return str->m_convertedToChar + m_offset;
|
||||||
}
|
}
|
||||||
#endif // wxUSE_UNICODE
|
#endif // wxUSE_UNICODE
|
||||||
@ -208,8 +224,24 @@ const char* wxCStrData::AsChar() const
|
|||||||
const wchar_t* wxCStrData::AsWChar() const
|
const wchar_t* wxCStrData::AsWChar() const
|
||||||
{
|
{
|
||||||
wxString *str = wxConstCast(m_str, wxString);
|
wxString *str = wxConstCast(m_str, wxString);
|
||||||
// convert the string and keep it:
|
|
||||||
str->m_convertedToWChar = str->wc_str().release();
|
// convert the string:
|
||||||
|
wxWCharBuffer buf(str->wc_str());
|
||||||
|
|
||||||
|
// FIXME-UTF8: do the conversion in-place in the existing buffer
|
||||||
|
if ( str->m_convertedToWChar &&
|
||||||
|
wxWcslen(buf) == wxWcslen(str->m_convertedToWChar) )
|
||||||
|
{
|
||||||
|
// keep the same buffer for as long as possible, so that several calls
|
||||||
|
// to c_str() in a row still work:
|
||||||
|
memcpy(str->m_convertedToWChar, buf, sizeof(wchar_t) * wxWcslen(buf));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str->m_convertedToWChar = buf.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
// and keep it:
|
||||||
return str->m_convertedToWChar + m_offset;
|
return str->m_convertedToWChar + m_offset;
|
||||||
}
|
}
|
||||||
#endif // !wxUSE_UNICODE_WCHAR
|
#endif // !wxUSE_UNICODE_WCHAR
|
||||||
|
Loading…
Reference in New Issue
Block a user