]> git.saurik.com Git - wxWidgets.git/commitdiff
Correct wxConvAuto::ToWChar() behaviour with wxNO_LEN input size.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 3 Oct 2010 17:15:18 +0000 (17:15 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 3 Oct 2010 17:15:18 +0000 (17:15 +0000)
We didn't handle the case when the length of the input buffer was not
specified correctly and wxConvAuto::DetectBOM() could read beyond the end of
input. Moreover, the unit test actually relied on this as it didn't pass the
correct length for the literal strings with embedded NULs. This somehow worked
with MSVC but failed with MinGW (see #10713).

Correct the code to handle wxNO_LEN case correctly and fix the unit test to
pass the correct lengths.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65739 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/convauto.cpp
tests/mbconv/convautotest.cpp

index 8d8c24c0a3e21ee2199f5b1a0b92d2d7c25869fb..756e81c233f2d71b77dfe0e7ae96f1ad6712f19c 100644 (file)
@@ -229,7 +229,7 @@ void wxConvAuto::SkipBOM(const char **src, size_t *len) const
 
 bool wxConvAuto::InitFromInput(const char *src, size_t len)
 {
 
 bool wxConvAuto::InitFromInput(const char *src, size_t len)
 {
-    m_bomType = DetectBOM(src, len);
+    m_bomType = DetectBOM(src, len == wxNO_LEN ? strlen(src) : len);
     if ( m_bomType == BOM_Unknown )
         return false;
 
     if ( m_bomType == BOM_Unknown )
         return false;
 
index 45fb79e0d530f0a95a9204dbcf2207b818de2ae4..4bb22253acd97f745f8b1e534e38ce3cb13cc3f9 100644 (file)
@@ -51,7 +51,10 @@ private:
 
     // real test function: check that converting the src multibyte string to
     // wide char using wxConvAuto yields wch as the first result
 
     // real test function: check that converting the src multibyte string to
     // wide char using wxConvAuto yields wch as the first result
-    void TestFirstChar(const char *src, wchar_t wch);
+    //
+    // the length of the string may need to be passed explicitly if it has
+    // embedded NULs, otherwise it's not necessary
+    void TestFirstChar(const char *src, wchar_t wch, int len = wxNO_LEN);
 
     void Empty();
     void Short();
 
     void Empty();
     void Short();
@@ -86,16 +89,16 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ConvAutoTestCase, "ConvAutoTestCase");
 // tests
 // ----------------------------------------------------------------------------
 
 // tests
 // ----------------------------------------------------------------------------
 
-void ConvAutoTestCase::TestFirstChar(const char *src, wchar_t wch)
+void ConvAutoTestCase::TestFirstChar(const char *src, wchar_t wch, int len)
 {
 {
-    wxWCharBuffer wbuf = wxConvAuto().cMB2WC(src);
+    wxWCharBuffer wbuf = wxConvAuto().cMB2WC(src, len, NULL);
     CPPUNIT_ASSERT( wbuf );
     CPPUNIT_ASSERT_EQUAL( wch, *wbuf );
 }
 
 void ConvAutoTestCase::Empty()
 {
     CPPUNIT_ASSERT( wbuf );
     CPPUNIT_ASSERT_EQUAL( wch, *wbuf );
 }
 
 void ConvAutoTestCase::Empty()
 {
-    TestFirstChar("", wxT('\0'));
+    CPPUNIT_ASSERT( !wxConvAuto().cMB2WC("") );
 }
 
 void ConvAutoTestCase::Short()
 }
 
 void ConvAutoTestCase::Short()
@@ -110,22 +113,22 @@ void ConvAutoTestCase::None()
 
 void ConvAutoTestCase::UTF32LE()
 {
 
 void ConvAutoTestCase::UTF32LE()
 {
-    TestFirstChar("\xff\xfe\0\0A\0\0\0", wxT('A'));
+    TestFirstChar("\xff\xfe\0\0A\0\0\0", wxT('A'), 8);
 }
 
 void ConvAutoTestCase::UTF32BE()
 {
 }
 
 void ConvAutoTestCase::UTF32BE()
 {
-    TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'));
+    TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'), 8);
 }
 
 void ConvAutoTestCase::UTF16LE()
 {
 }
 
 void ConvAutoTestCase::UTF16LE()
 {
-    TestFirstChar("\xff\xfeZ\0", wxT('Z'));
+    TestFirstChar("\xff\xfeZ\0", wxT('Z'), 4);
 }
 
 void ConvAutoTestCase::UTF16BE()
 {
 }
 
 void ConvAutoTestCase::UTF16BE()
 {
-    TestFirstChar("\xfe\xff\0Y", wxT('Y'));
+    TestFirstChar("\xfe\xff\0Y", wxT('Y'), 4);
 }
 
 void ConvAutoTestCase::UTF8()
 }
 
 void ConvAutoTestCase::UTF8()