Handle bad conversions correctly. Add Bad UTF8 test.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Ryan Norton
2004-10-29 10:13:59 +00:00
parent c20d8682bd
commit bdd8f35a58
2 changed files with 29 additions and 5 deletions

View File

@@ -1011,15 +1011,21 @@ inline size_t wxMbstr(char* szBuffer, const wchar_t* szString,
//Get the length of the current (sub)string
size_t nLen = conv.WC2MB(NULL, szPos, 0);
//Invalid conversion?
if( nLen == (size_t)-1 )
{
szBuffer[0] = '\0';
return 0;
}
// wxASSERT(nLen != (size_t)-1); //should not be true! If it is system wctomb could be bad
nActualLength += nLen + 1;
wxASSERT(nActualLength <= (nStringLen<<1) + 1); //If this is true it means buffer overflow
wxASSERT( nActualLength <= (nStringLen<<2) + 1 ); //If this is true it means buffer overflow
//Convert the current (sub)string
if ( nLen == (size_t)-1 ||
conv.WC2MB(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
if(conv.WC2MB(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
{
//error - return empty buffer
wxFAIL_MSG(wxT("Error converting wide-character string to a multi-byte string"));
@@ -1058,6 +1064,13 @@ inline size_t wxWcstr( wchar_t* szBuffer, const char* szString,
//Get the length of the current (sub)string
size_t nLen = conv.MB2WC(NULL, szPos, 0);
//Invalid conversion?
if( nLen == (size_t)-1 )
{
szBuffer[0] = '\0';
return 0;
}
// wxASSERT(nLen != (size_t)-1); //If true, conversion was invalid, or system mbtowc could be bad
nActualLength += nLen + 1;
@@ -1065,8 +1078,7 @@ inline size_t wxWcstr( wchar_t* szBuffer, const char* szString,
wxASSERT(nActualLength <= nStringLen + 1); //If this is true it means buffer overflow
//Convert the current (sub)string
if ( nLen == (size_t)-1 ||
conv.MB2WC(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
if ( conv.MB2WC(&szBuffer[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
{
//error - return empty buffer
wxFAIL_MSG(wxT("Error converting multi-byte string to a wide-character string"));
@@ -1156,6 +1168,8 @@ wxWCharBuffer buffer(nLen + 1);
//Convert wxString in Unicode mode to a multi-byte string
const wxCharBuffer wxString::mb_str(wxMBConv& conv) const
{
//FIXME: This may be invalid for UTF7 and other charsets
//*4 is the worst case - for UTF8
wxCharBuffer buffer((length() << 2) + 1);
@@ -1204,6 +1218,8 @@ wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength)
// anything to do?
if ( (nLen != 0) && (nLen != (size_t)-1) )
{
//FIXME: This may be invalid for UTF7 and other charsets
//*4 is the worst case - for UTF8
wxStringBufferLength internalBuffer(*this, (nLen << 2) + 1);