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:
Václav Slavík 2007-04-10 19:13:52 +00:00
parent dc3065a56f
commit 05f32fc39e
2 changed files with 37 additions and 5 deletions

View File

@ -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)
{ {

View File

@ -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