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
This commit is contained in:
Vadim Zeitlin 2012-04-28 22:25:19 +00:00
parent 586bed9446
commit a610eb7369
2 changed files with 25 additions and 0 deletions

View File

@ -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);

View File

@ -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);