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:
@@ -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
|
// pNewLast can be NULL here -- it's ok and can happen if we have no
|
||||||
// entries left
|
// entries left
|
||||||
m_pLastEntry = pNewLast;
|
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);
|
m_pConfig->LineListRemove(pLine);
|
||||||
|
@@ -71,6 +71,7 @@ private:
|
|||||||
CPPUNIT_TEST( Save );
|
CPPUNIT_TEST( Save );
|
||||||
CPPUNIT_TEST( DeleteEntry );
|
CPPUNIT_TEST( DeleteEntry );
|
||||||
CPPUNIT_TEST( DeleteAndWriteEntry );
|
CPPUNIT_TEST( DeleteAndWriteEntry );
|
||||||
|
CPPUNIT_TEST( DeleteLastRootEntry );
|
||||||
CPPUNIT_TEST( DeleteGroup );
|
CPPUNIT_TEST( DeleteGroup );
|
||||||
CPPUNIT_TEST( DeleteAll );
|
CPPUNIT_TEST( DeleteAll );
|
||||||
CPPUNIT_TEST( RenameEntry );
|
CPPUNIT_TEST( RenameEntry );
|
||||||
@@ -95,6 +96,7 @@ private:
|
|||||||
void Save();
|
void Save();
|
||||||
void DeleteEntry();
|
void DeleteEntry();
|
||||||
void DeleteAndWriteEntry();
|
void DeleteAndWriteEntry();
|
||||||
|
void DeleteLastRootEntry();
|
||||||
void DeleteGroup();
|
void DeleteGroup();
|
||||||
void DeleteAll();
|
void DeleteAll();
|
||||||
void RenameEntry();
|
void RenameEntry();
|
||||||
@@ -376,6 +378,24 @@ void FileConfigTestCase::DeleteAndWriteEntry()
|
|||||||
wxVERIFY_FILECONFIG( "", fc );
|
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()
|
void FileConfigTestCase::DeleteGroup()
|
||||||
{
|
{
|
||||||
wxStringInputStream sis(testconfig);
|
wxStringInputStream sis(testconfig);
|
||||||
|
Reference in New Issue
Block a user