Fix fatal bug in the recently added wxFile::ReadAll().

Make sure we exit the loop when reading the file in chunks in
wxFile::ReadAll() and add a unit test for it to ensure that it's really
correct.

Closes #14725.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72614 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-10-04 22:47:44 +00:00
parent 825417a419
commit 06a086e8d2
2 changed files with 30 additions and 1 deletions

View File

@@ -295,7 +295,7 @@ bool wxFile::ReadAll(wxString *str, const wxMBConv& conv)
{ {
wxCHECK_MSG( str, false, wxS("Output string must be non-NULL") ); wxCHECK_MSG( str, false, wxS("Output string must be non-NULL") );
size_t length = wx_truncate_cast(size_t, Length()); ssize_t length = Length();
wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") ); wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") );
wxCharBuffer buf(length); wxCharBuffer buf(length);
@@ -309,6 +309,10 @@ bool wxFile::ReadAll(wxString *str, const wxMBConv& conv)
return false; return false;
p += nread; p += nread;
if ( length <= nread )
break;
length -= nread;
} }
*p = 0; *p = 0;

View File

@@ -34,6 +34,7 @@ public:
private: private:
CPPUNIT_TEST_SUITE( FileTestCase ); CPPUNIT_TEST_SUITE( FileTestCase );
CPPUNIT_TEST( ReadAll );
#if wxUSE_UNICODE #if wxUSE_UNICODE
CPPUNIT_TEST( RoundTripUTF8 ); CPPUNIT_TEST( RoundTripUTF8 );
CPPUNIT_TEST( RoundTripUTF16 ); CPPUNIT_TEST( RoundTripUTF16 );
@@ -42,6 +43,7 @@ private:
CPPUNIT_TEST( TempFile ); CPPUNIT_TEST( TempFile );
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
void ReadAll();
#if wxUSE_UNICODE #if wxUSE_UNICODE
void RoundTripUTF8() { DoRoundTripTest(wxConvUTF8); } void RoundTripUTF8() { DoRoundTripTest(wxConvUTF8); }
void RoundTripUTF16() { DoRoundTripTest(wxMBConvUTF16()); } void RoundTripUTF16() { DoRoundTripTest(wxMBConvUTF16()); }
@@ -65,6 +67,29 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FileTestCase, "FileTestCase" );
// tests implementation // tests implementation
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void FileTestCase::ReadAll()
{
TestFile tf;
const char* text = "Ream\nde";
{
wxFile fout(tf.GetName(), wxFile::write);
CPPUNIT_ASSERT( fout.IsOpened() );
fout.Write(text, strlen(text));
CPPUNIT_ASSERT( fout.Close() );
}
{
wxFile fin(tf.GetName(), wxFile::read);
CPPUNIT_ASSERT( fin.IsOpened() );
wxString s;
CPPUNIT_ASSERT( fin.ReadAll(&s) );
CPPUNIT_ASSERT_EQUAL( text, s );
}
}
#if wxUSE_UNICODE #if wxUSE_UNICODE
void FileTestCase::DoRoundTripTest(const wxMBConv& conv) void FileTestCase::DoRoundTripTest(const wxMBConv& conv)