From a610eb7369be603460468f1e2ab894873a638ab0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 28 Apr 2012 22:25:19 +0000 Subject: [PATCH] Fix crash in wxFileConfig when deleting last entry of the root group. This resulted in keeping a dangling pointer to the group line in wxFileConfigGroup and any attempt to use it after this resulted in a crash. Fix this by explicitly resetting the last line in this case. Also add a unit test for this scenario. Closes #14243. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71311 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/fileconf.cpp | 5 +++++ tests/config/fileconf.cpp | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index 75fcd7c..4b63270 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -1818,6 +1818,11 @@ bool wxFileConfigGroup::DeleteEntry(const wxString& name) // pNewLast can be NULL here -- it's ok and can happen if we have no // entries left m_pLastEntry = pNewLast; + + // For the root group only, we could be removing the first group line + // here, so update m_pLine to avoid keeping a dangling pointer. + if ( pLine == m_pLine ) + SetLine(NULL); } m_pConfig->LineListRemove(pLine); diff --git a/tests/config/fileconf.cpp b/tests/config/fileconf.cpp index 7a9c2d7..a92bdb6 100644 --- a/tests/config/fileconf.cpp +++ b/tests/config/fileconf.cpp @@ -71,6 +71,7 @@ private: CPPUNIT_TEST( Save ); CPPUNIT_TEST( DeleteEntry ); CPPUNIT_TEST( DeleteAndWriteEntry ); + CPPUNIT_TEST( DeleteLastRootEntry ); CPPUNIT_TEST( DeleteGroup ); CPPUNIT_TEST( DeleteAll ); CPPUNIT_TEST( RenameEntry ); @@ -95,6 +96,7 @@ private: void Save(); void DeleteEntry(); void DeleteAndWriteEntry(); + void DeleteLastRootEntry(); void DeleteGroup(); void DeleteAll(); void RenameEntry(); @@ -376,6 +378,24 @@ void FileConfigTestCase::DeleteAndWriteEntry() wxVERIFY_FILECONFIG( "", fc ); } +void FileConfigTestCase::DeleteLastRootEntry() +{ + // This tests for the bug which occurred when the last entry of the root + // group was deleted: this corrupted internal state and resulted in a crash + // after trying to write the just deleted entry again. + wxStringInputStream sis(""); + wxFileConfig fc(sis); + + fc.Write("key", "value"); + wxVERIFY_FILECONFIG( "key=value\n", fc ); + + fc.DeleteEntry("key"); + wxVERIFY_FILECONFIG( "", fc ); + + fc.Write("key", "value"); + wxVERIFY_FILECONFIG( "key=value\n", fc ); +} + void FileConfigTestCase::DeleteGroup() { wxStringInputStream sis(testconfig); -- 2.7.4