From: Vadim Zeitlin Date: Sun, 3 Oct 2010 17:15:18 +0000 (+0000) Subject: Correct wxConvAuto::ToWChar() behaviour with wxNO_LEN input size. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/9334ad1727a9906a98e7a58f616ef617fd466771 Correct wxConvAuto::ToWChar() behaviour with wxNO_LEN input size. 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 --- diff --git a/src/common/convauto.cpp b/src/common/convauto.cpp index 8d8c24c0a3..756e81c233 100644 --- a/src/common/convauto.cpp +++ b/src/common/convauto.cpp @@ -229,7 +229,7 @@ void wxConvAuto::SkipBOM(const char **src, size_t *len) const 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; diff --git a/tests/mbconv/convautotest.cpp b/tests/mbconv/convautotest.cpp index 45fb79e0d5..4bb22253ac 100644 --- a/tests/mbconv/convautotest.cpp +++ b/tests/mbconv/convautotest.cpp @@ -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 - 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(); @@ -86,16 +89,16 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ConvAutoTestCase, "ConvAutoTestCase"); // 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() { - TestFirstChar("", wxT('\0')); + CPPUNIT_ASSERT( !wxConvAuto().cMB2WC("") ); } void ConvAutoTestCase::Short() @@ -110,22 +113,22 @@ void ConvAutoTestCase::None() 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() { - TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B')); + TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'), 8); } void ConvAutoTestCase::UTF16LE() { - TestFirstChar("\xff\xfeZ\0", wxT('Z')); + TestFirstChar("\xff\xfeZ\0", wxT('Z'), 4); } void ConvAutoTestCase::UTF16BE() { - TestFirstChar("\xfe\xff\0Y", wxT('Y')); + TestFirstChar("\xfe\xff\0Y", wxT('Y'), 4); } void ConvAutoTestCase::UTF8()