]> git.saurik.com Git - wxWidgets.git/commitdiff
Handle bad conversions correctly. Add Bad UTF8 test.
authorRyan Norton <wxprojects@comcast.net>
Fri, 29 Oct 2004 10:13:59 +0000 (10:13 +0000)
committerRyan Norton <wxprojects@comcast.net>
Fri, 29 Oct 2004 10:13:59 +0000 (10:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/string.cpp
tests/strings/strings.cpp

index a98d966d91985c7c616b13d764860b45a7f6eea6..2b039bfc0460a335f27f33bb901ffc1470805755 100644 (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);
 
index ac619a451111e190118a0f073b59fbacb1a9bd74..afb6207ae18a4a62f464d1dee27064f1195d3c5b 100644 (file)
@@ -185,6 +185,14 @@ void StringTestCase::ConstructorsWithConversion()
 
     CPPUNIT_ASSERT( s3 == sub );
     CPPUNIT_ASSERT( s4 == sub );
+
+#if wxUSE_UNICODE
+    CPPUNIT_ASSERT ( wxString("\t[pl]open.format.Sformatuj dyskietkê=gfloppy %f", 
+                               wxConvUTF8) == wxT("") ); //Pos 35 (funky e) is invalid UTF8
+#else
+    CPPUNIT_ASSERT ( wxString(L"\t[pl]open.format.Sformatuj dyskietkê=gfloppy %f", 
+                               wxConvUTF8) == wxT("") ); //Pos 35 (funky e) is invalid UTF8
+#endif
 }
 
 void StringTestCase::Conversion()