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
This commit is contained in:
Vadim Zeitlin
2008-01-15 16:56:17 +00:00
parent 6167969572
commit 7bac0684f5
2 changed files with 42 additions and 4 deletions

View File

@@ -132,7 +132,7 @@ wxBase64Decode(void *dst_, size_t dstLen,
// force the loop to stop and an error to be returned // force the loop to stop and an error to be returned
n = -1; n = -1;
srcLen = 0; srcLen = 1;
break; break;
case PAD: case PAD:
@@ -156,7 +156,7 @@ wxBase64Decode(void *dst_, size_t dstLen,
{ {
// force the loop terminate with an error // force the loop terminate with an error
n = -1; n = -1;
srcLen = 0; srcLen = 1;
} }
break; break;
@@ -165,7 +165,7 @@ wxBase64Decode(void *dst_, size_t dstLen,
{ {
// nothing is allowed after the end so provoke error return // nothing is allowed after the end so provoke error return
n = -1; n = -1;
srcLen = 0; srcLen = 1;
break; break;
} }
@@ -194,7 +194,11 @@ wxBase64Decode(void *dst_, size_t dstLen,
if ( n ) if ( n )
{ {
if ( posErr ) 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; return wxCONV_FAILED;
} }

View File

@@ -90,6 +90,7 @@ private:
CPPUNIT_TEST( EncodeDecodePatternB ); CPPUNIT_TEST( EncodeDecodePatternB );
CPPUNIT_TEST( EncodeDecodePatternC ); CPPUNIT_TEST( EncodeDecodePatternC );
CPPUNIT_TEST( EncodeDecodeRandom ); CPPUNIT_TEST( EncodeDecodeRandom );
CPPUNIT_TEST( DecodeInvalid );
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
void EncodeDecodeEmpty(); void EncodeDecodeEmpty();
@@ -102,6 +103,7 @@ private:
void EncodeDecodePatternB(); void EncodeDecodePatternB();
void EncodeDecodePatternC(); void EncodeDecodePatternC();
void EncodeDecodeRandom(); void EncodeDecodeRandom();
void DecodeInvalid();
DECLARE_NO_COPY_CLASS(Base64TestCase) DECLARE_NO_COPY_CLASS(Base64TestCase)
}; };
@@ -233,4 +235,36 @@ void Base64TestCase::EncodeDecodeRandom()
CPPUNIT_ASSERT(wxBase64Encode(buff2, size, buff2, realsize)); 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 #endif // wxUSE_BASE64