X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eecb33b0189a3804dead82317a575e0f1d52cd9f..d181c36eb6366cb7da719c95eef50b281cedbbdc:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 4d16458ff8..aa150ea4af 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -312,13 +312,15 @@ bool wxStringBase::AllocBeforeWrite(size_t nLen) pData->nAllocLength = nLen; m_pchData = pData->data(); } - - // now we have enough space, just update the string length - pData->nDataLength = nLen; } wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner + // it doesn't really matter what the string length is as it's going to be + // overwritten later but, for extra safety, set it to 0 for now as we may + // have some junk in m_pchData + GetStringData()->nDataLength = 0; + return true; } @@ -326,7 +328,7 @@ wxStringBase& wxStringBase::append(size_t n, wxChar ch) { size_type len = length(); - if ( !CopyBeforeWrite() || !Alloc(len + n) ) { + if ( !Alloc(len + n) || !CopyBeforeWrite() ) { wxFAIL_MSG( _T("out of memory in wxStringBase::append") ); } GetStringData()->nDataLength = len + n; @@ -380,7 +382,9 @@ bool wxStringBase::Alloc(size_t nLen) // allocation failure handled by caller return false; } - memcpy(m_pchData, pData->data(), nOldLen*sizeof(wxChar)); + // +1 to copy the terminator, too + memcpy(m_pchData, pData->data(), (nOldLen+1)*sizeof(wxChar)); + GetStringData()->nDataLength = nOldLen; } else { nLen += EXTRA_ALLOC; @@ -445,7 +449,7 @@ wxStringBase& wxStringBase::insert(size_t nPos, const wxChar *sz, size_t n) if ( n == npos ) n = wxStrlen(sz); if ( n == 0 ) return *this; - if ( !CopyBeforeWrite() || !Alloc(length() + n) ) { + if ( !Alloc(length() + n) || !CopyBeforeWrite() ) { wxFAIL_MSG( _T("out of memory in wxStringBase::insert") ); } @@ -481,8 +485,14 @@ size_t wxStringBase::find(const wxStringBase& str, size_t nStart) const while(p - c_str() + str.length() <= length() && wxTmemcmp(p, str.c_str(), str.length()) ) { + //Previosly passed as the first argument to wxTmemchr, + //but C/C++ standard does not specify evaluation order + //of arguments to functions - + //http://embedded.com/showArticle.jhtml?articleID=9900607 + ++p; + //anchor again - p = (const wxChar*)wxTmemchr(++p, + p = (const wxChar*)wxTmemchr(p, str.c_str()[0], length() - (p - c_str())); @@ -1219,7 +1229,7 @@ wxString operator+(const wxString& str, const wxChar *psz) if ( !s.Alloc(wxStrlen(psz) + str.Len()) ) { wxFAIL_MSG( _T("out of memory in wxString::operator+") ); } - s = str; + s += str; s += psz; return s;