Never overflow the output buffer in wxBase64Decode().

Don't write extra NUL bytes obtained by decoding the padding at the end of
input into the output buffer as there may be not enough place in it for them.
And in any case the buffer is not (always) NUL-terminated as no NUL bytes are
obtained in absence of padding, so it's better to never terminate it for
consistency.

Closes #11101.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61753 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-08-23 22:25:12 +00:00
parent e331a94e90
commit 07890fbeb5
4 changed files with 49 additions and 3 deletions

View File

@@ -142,6 +142,13 @@ void Base64TestCase::EncodeDecodeA()
wxMemoryBuffer buf = wxBase64Decode(str);
CPPUNIT_ASSERT_EQUAL(1, buf.GetDataLen());
CPPUNIT_ASSERT_EQUAL('A', *(char *)buf.GetData());
char cbuf[10];
memset(cbuf, (char)-1, sizeof(cbuf));
CPPUNIT_ASSERT_EQUAL( 1, wxBase64Decode(cbuf, 1, str) );
CPPUNIT_ASSERT_EQUAL( 'A', cbuf[0] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[1] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[2] );
}
void Base64TestCase::EncodeDecodeAB()
@@ -153,6 +160,15 @@ void Base64TestCase::EncodeDecodeAB()
CPPUNIT_ASSERT_EQUAL(2, buf.GetDataLen());
CPPUNIT_ASSERT_EQUAL('A', buf[0]);
CPPUNIT_ASSERT_EQUAL('B', buf[1]);
char cbuf[10];
memset(cbuf, (char)-1, sizeof(cbuf));
CPPUNIT_ASSERT_EQUAL( wxCONV_FAILED, wxBase64Decode(cbuf, 1, str) );
CPPUNIT_ASSERT_EQUAL( 2, wxBase64Decode(cbuf, 2, str) );
CPPUNIT_ASSERT_EQUAL( 'A', cbuf[0] );
CPPUNIT_ASSERT_EQUAL( 'B', cbuf[1] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[2] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[3] );
}
void Base64TestCase::EncodeDecodeABC()
@@ -165,6 +181,16 @@ void Base64TestCase::EncodeDecodeABC()
CPPUNIT_ASSERT_EQUAL('A', buf[0]);
CPPUNIT_ASSERT_EQUAL('B', buf[1]);
CPPUNIT_ASSERT_EQUAL('C', buf[2]);
char cbuf[10];
memset(cbuf, (char)-1, sizeof(cbuf));
CPPUNIT_ASSERT_EQUAL( wxCONV_FAILED, wxBase64Decode(cbuf, 2, str) );
CPPUNIT_ASSERT_EQUAL( 3, wxBase64Decode(cbuf, 3, str) );
CPPUNIT_ASSERT_EQUAL( 'A', cbuf[0] );
CPPUNIT_ASSERT_EQUAL( 'B', cbuf[1] );
CPPUNIT_ASSERT_EQUAL( 'C', cbuf[2] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[3] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[4] );
}
void Base64TestCase::EncodeDecodeABCD()
@@ -178,6 +204,17 @@ void Base64TestCase::EncodeDecodeABCD()
CPPUNIT_ASSERT_EQUAL('B', buf[1]);
CPPUNIT_ASSERT_EQUAL('C', buf[2]);
CPPUNIT_ASSERT_EQUAL('D', buf[3]);
char cbuf[10];
memset(cbuf, (char)-1, sizeof(cbuf));
CPPUNIT_ASSERT_EQUAL( wxCONV_FAILED, wxBase64Decode(cbuf, 3, str) );
CPPUNIT_ASSERT_EQUAL( 4, wxBase64Decode(cbuf, 4, str) );
CPPUNIT_ASSERT_EQUAL( 'A', cbuf[0] );
CPPUNIT_ASSERT_EQUAL( 'B', cbuf[1] );
CPPUNIT_ASSERT_EQUAL( 'C', cbuf[2] );
CPPUNIT_ASSERT_EQUAL( 'D', cbuf[3] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[4] );
CPPUNIT_ASSERT_EQUAL( (char)-1, cbuf[5] );
}
void Base64TestCase::EncodeDecode0to255()