]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix fatal bug in the recently added wxFile::ReadAll().
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 4 Oct 2012 22:47:44 +0000 (22:47 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 4 Oct 2012 22:47:44 +0000 (22:47 +0000)
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

src/common/file.cpp
tests/file/filetest.cpp

index b2cd1bed5f6a0ff54889792d1773bd8c6bf97f47..f9badf53953e01b49bf63101b2c546f9515fe950 100644 (file)
@@ -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;
index 4ee972b8b70ce1805ef7d68330d1f10bbb9e47bf..4c2f9b4135c9fcb44fed266488f19f0a8b3748a4 100644 (file)
@@ -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)