From: Vadim Zeitlin Date: Thu, 4 Oct 2012 22:47:44 +0000 (+0000) Subject: Fix fatal bug in the recently added wxFile::ReadAll(). X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/06a086e8d24a83391e7acaf34c31548105916a1a 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 --- diff --git a/src/common/file.cpp b/src/common/file.cpp index b2cd1bed5f..f9badf5395 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -295,7 +295,7 @@ bool wxFile::ReadAll(wxString *str, const wxMBConv& conv) { 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") ); wxCharBuffer buf(length); @@ -309,6 +309,10 @@ bool wxFile::ReadAll(wxString *str, const wxMBConv& conv) return false; p += nread; + if ( length <= nread ) + break; + + length -= nread; } *p = 0; diff --git a/tests/file/filetest.cpp b/tests/file/filetest.cpp index 4ee972b8b7..4c2f9b4135 100644 --- a/tests/file/filetest.cpp +++ b/tests/file/filetest.cpp @@ -34,6 +34,7 @@ public: private: CPPUNIT_TEST_SUITE( FileTestCase ); + CPPUNIT_TEST( ReadAll ); #if wxUSE_UNICODE CPPUNIT_TEST( RoundTripUTF8 ); CPPUNIT_TEST( RoundTripUTF16 ); @@ -42,6 +43,7 @@ private: CPPUNIT_TEST( TempFile ); CPPUNIT_TEST_SUITE_END(); + void ReadAll(); #if wxUSE_UNICODE void RoundTripUTF8() { DoRoundTripTest(wxConvUTF8); } void RoundTripUTF16() { DoRoundTripTest(wxMBConvUTF16()); } @@ -65,6 +67,29 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FileTestCase, "FileTestCase" ); // 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 void FileTestCase::DoRoundTripTest(const wxMBConv& conv)