From: Vadim Zeitlin Date: Tue, 15 Jan 2008 16:56:17 +0000 (+0000) Subject: added unit tests for decoding invalid base64 strings; corrected bugs exposed by them X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7bac0684f586a7d2a0601f57407402a735bc75b0 added unit tests for decoding invalid base64 strings; corrected bugs exposed by them git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51225 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/base64.cpp b/src/common/base64.cpp index eeafaa40f4..2832bffb3b 100644 --- a/src/common/base64.cpp +++ b/src/common/base64.cpp @@ -132,7 +132,7 @@ wxBase64Decode(void *dst_, size_t dstLen, // force the loop to stop and an error to be returned n = -1; - srcLen = 0; + srcLen = 1; break; case PAD: @@ -156,7 +156,7 @@ wxBase64Decode(void *dst_, size_t dstLen, { // force the loop terminate with an error n = -1; - srcLen = 0; + srcLen = 1; } break; @@ -165,7 +165,7 @@ wxBase64Decode(void *dst_, size_t dstLen, { // nothing is allowed after the end so provoke error return n = -1; - srcLen = 0; + srcLen = 1; break; } @@ -194,7 +194,11 @@ wxBase64Decode(void *dst_, size_t dstLen, if ( n ) { if ( posErr ) - *posErr = p - src; + { + // notice that the error was on a previous position as we did one + // extra "p++" in the loop line after it + *posErr = p - src - 1; + } return wxCONV_FAILED; } diff --git a/tests/base64/base64.cpp b/tests/base64/base64.cpp index 7b492d7e69..a63512aca2 100644 --- a/tests/base64/base64.cpp +++ b/tests/base64/base64.cpp @@ -90,6 +90,7 @@ private: CPPUNIT_TEST( EncodeDecodePatternB ); CPPUNIT_TEST( EncodeDecodePatternC ); CPPUNIT_TEST( EncodeDecodeRandom ); + CPPUNIT_TEST( DecodeInvalid ); CPPUNIT_TEST_SUITE_END(); void EncodeDecodeEmpty(); @@ -102,6 +103,7 @@ private: void EncodeDecodePatternB(); void EncodeDecodePatternC(); void EncodeDecodeRandom(); + void DecodeInvalid(); DECLARE_NO_COPY_CLASS(Base64TestCase) }; @@ -233,4 +235,36 @@ void Base64TestCase::EncodeDecodeRandom() CPPUNIT_ASSERT(wxBase64Encode(buff2, size, buff2, realsize)); } +void Base64TestCase::DecodeInvalid() +{ + size_t rc, posErr; + rc = wxBase64Decode(NULL, 0, "one two!", wxNO_LEN, + wxBase64DecodeMode_Strict, &posErr); + CPPUNIT_ASSERT_EQUAL( wxCONV_FAILED, rc); + WX_ASSERT_SIZET_EQUAL( 3, posErr ); + + rc = wxBase64Decode(NULL, 0, "one two!", wxNO_LEN, + wxBase64DecodeMode_SkipWS, &posErr); + CPPUNIT_ASSERT_EQUAL( wxCONV_FAILED, rc); + WX_ASSERT_SIZET_EQUAL( 7, posErr ); + + rc = wxBase64Decode(NULL, 0, "? QQ==", wxNO_LEN, + wxBase64DecodeMode_SkipWS, &posErr); + CPPUNIT_ASSERT_EQUAL( wxCONV_FAILED, rc); + WX_ASSERT_SIZET_EQUAL( 0, posErr ); + + posErr = (size_t)-1; + rc = wxBase64Decode(NULL, 0, " QQ==", wxNO_LEN, + wxBase64DecodeMode_SkipWS, &posErr); + WX_ASSERT_SIZET_EQUAL( 1, rc ); + WX_ASSERT_SIZET_EQUAL( -1, posErr ); + + rc = wxBase64Decode(NULL, 0, "? QQ==", wxNO_LEN, + wxBase64DecodeMode_Relaxed, &posErr); + WX_ASSERT_SIZET_EQUAL( 1, rc ); + WX_ASSERT_SIZET_EQUAL( -1, posErr ); + + CPPUNIT_ASSERT( !wxBase64Decode("wxGetApp()").GetDataLen() ); +} + #endif // wxUSE_BASE64