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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user