Don't crash when input is empty in wxFileConfig(wxInputStream) ctor.
Fix crash due to dereferencing a NULL pointer when the input buffer in wxFileConfig ctor is empty. Closes #11636. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63228 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -436,6 +436,7 @@ All:
|
|||||||
- Added wxHttp::GetCookie and wxHttp::HasCookies (dodge).
|
- Added wxHttp::GetCookie and wxHttp::HasCookies (dodge).
|
||||||
- Added support for unique volume names to wxFileName (Neno Ganchev).
|
- Added support for unique volume names to wxFileName (Neno Ganchev).
|
||||||
- Correct bugs when using wxTextInputStream with wxConvAuto (Leon Buikstra).
|
- Correct bugs when using wxTextInputStream with wxConvAuto (Leon Buikstra).
|
||||||
|
- Don't crash when input is empty in wxFileConfig ctor (Lukasz Michalski).
|
||||||
|
|
||||||
Unix:
|
Unix:
|
||||||
|
|
||||||
|
@@ -469,33 +469,36 @@ wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv)
|
|||||||
cbuf = wxCharBuffer::CreateNonOwned((char *)buf.GetData(), buf.GetDataLen());
|
cbuf = wxCharBuffer::CreateNonOwned((char *)buf.GetData(), buf.GetDataLen());
|
||||||
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
|
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
|
||||||
|
|
||||||
|
// parse the input contents if there is anything to parse
|
||||||
// now break it into lines
|
if ( cbuf )
|
||||||
wxMemoryText memText;
|
|
||||||
for ( const wxChar *s = cbuf; ; ++s )
|
|
||||||
{
|
{
|
||||||
const wxChar *e = s;
|
// now break it into lines
|
||||||
while ( *e != '\0' && *e != '\n' && *e != '\r' )
|
wxMemoryText memText;
|
||||||
++e;
|
for ( const wxChar *s = cbuf; ; ++s )
|
||||||
|
{
|
||||||
|
const wxChar *e = s;
|
||||||
|
while ( *e != '\0' && *e != '\n' && *e != '\r' )
|
||||||
|
++e;
|
||||||
|
|
||||||
// notice that we throw away the original EOL kind here, maybe we
|
// notice that we throw away the original EOL kind here, maybe we
|
||||||
// should preserve it?
|
// should preserve it?
|
||||||
if ( e != s )
|
if ( e != s )
|
||||||
memText.AddLine(wxString(s, e));
|
memText.AddLine(wxString(s, e));
|
||||||
|
|
||||||
if ( *e == '\0' )
|
if ( *e == '\0' )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// skip the second EOL byte if it's a DOS one
|
// skip the second EOL byte if it's a DOS one
|
||||||
if ( *e == '\r' && e[1] == '\n' )
|
if ( *e == '\r' && e[1] == '\n' )
|
||||||
++e;
|
++e;
|
||||||
|
|
||||||
s = e;
|
s = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally we can parse it all.
|
||||||
|
Parse(memText, true /* local */);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally we can parse it all.
|
|
||||||
Parse(memText, true /* local */);
|
|
||||||
|
|
||||||
SetRootPath();
|
SetRootPath();
|
||||||
ResetDirty();
|
ResetDirty();
|
||||||
}
|
}
|
||||||
|
@@ -81,6 +81,7 @@ private:
|
|||||||
CPPUNIT_TEST( DeleteAndRecreateGroup );
|
CPPUNIT_TEST( DeleteAndRecreateGroup );
|
||||||
CPPUNIT_TEST( AddToExistingRoot );
|
CPPUNIT_TEST( AddToExistingRoot );
|
||||||
CPPUNIT_TEST( ReadNonExistent );
|
CPPUNIT_TEST( ReadNonExistent );
|
||||||
|
CPPUNIT_TEST( ReadEmpty );
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
void Path();
|
void Path();
|
||||||
@@ -103,6 +104,7 @@ private:
|
|||||||
void DeleteAndRecreateGroup();
|
void DeleteAndRecreateGroup();
|
||||||
void AddToExistingRoot();
|
void AddToExistingRoot();
|
||||||
void ReadNonExistent();
|
void ReadNonExistent();
|
||||||
|
void ReadEmpty();
|
||||||
|
|
||||||
|
|
||||||
static wxString ChangePath(wxFileConfig& fc, const wxChar *path)
|
static wxString ChangePath(wxFileConfig& fc, const wxChar *path)
|
||||||
@@ -649,5 +651,13 @@ void FileConfigTestCase::ReadNonExistent()
|
|||||||
CPPUNIT_ASSERT( !fc.Read("URL", &url) );
|
CPPUNIT_ASSERT( !fc.Read("URL", &url) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileConfigTestCase::ReadEmpty()
|
||||||
|
{
|
||||||
|
static const char *confTest = "";
|
||||||
|
|
||||||
|
wxStringInputStream sis(confTest);
|
||||||
|
wxFileConfig fc(sis);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // wxUSE_FILECONFIG
|
#endif // wxUSE_FILECONFIG
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user