From 85a811c19f27bebbcd381e4ddeb266e0f0f42392 Mon Sep 17 00:00:00 2001 From: Charl Wentzel Date: Sun, 18 Nov 2018 12:47:33 +0200 Subject: [PATCH] Important Bug fix: - Fixed memory errors and leaks in DataTreeCore: - Initial values not set correctly for Name, Next/PrevPeer - Correctly set Last/FirstChild & Prev/NextPeer references on delete - Added methods SetValuePtr() - Fixed memory errors and leaks in JSONparseCore: - Set set string/int/float values by passing pointers, ie. SetValuePtr() --- DataTreeCore.cpp | 71 ++++++++++++++++++++++++++++++++++------------- DataTreeCore.h | 3 +- JSONparseCore.cpp | 8 +++--- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index de09523..15746d2 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -16,24 +16,27 @@ CDataMember::CDataMember( const char * pName, const int pLen ) { - if (Name) { + if (pName) { NameLen = (pLen == -1)? strlen( pName ) : pLen ; Name = (char *)malloc( NameLen+1 ); memcpy( Name, pName, NameLen ); Name[ NameLen ] = 0; } + else { + Name = NULL; + NameLen = 0; + } - Type = jtNull; - - Value = NULL; - Len = 0; + Type = jtNull; + Value = NULL; + Len = 0; FirstChild = NULL; LastChild = NULL; Parent = NULL; - PrevPeer = NULL; - NextPeer = NULL; + PrevPeer = NULL; + NextPeer = NULL; } //--------------------------------------------------------------------------- @@ -45,19 +48,22 @@ CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int p memcpy( Name, pName, NameLen ); Name[ NameLen ] = 0; } + else { + Name = NULL; + NameLen = 0; + } - Type = jtNull; - - Value = NULL; - Len = 0; + Type = jtNull; + Value = NULL; + Len = 0; FirstChild = NULL; LastChild = NULL; if (!pParent) { - Parent = NULL; - PrevPeer = NULL; - NextPeer = NULL; + Parent = NULL; + PrevPeer = NULL; + NextPeer = NULL; } else { // Clear/reset parent if not object @@ -69,12 +75,17 @@ CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int p // Insert into Parent & Peer lists Parent->Len++; if (!Parent->FirstChild) { + PrevPeer = NULL; + NextPeer = NULL; + Parent->FirstChild = this; Parent->LastChild = this; } else { PrevPeer = Parent->LastChild; Parent->LastChild->NextPeer = this; + NextPeer = NULL; + Parent->LastChild = this; } } @@ -84,13 +95,21 @@ CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int p CDataMember::~CDataMember() { // Remove from parent - if (Parent) + if (Parent) { Parent->Len--; - if (this == Parent->LastChild) { - Parent->LastChild = PrevPeer; + if (this == Parent->LastChild) { + Parent->LastChild = PrevPeer; + } + if (this == Parent->FirstChild) { + Parent->FirstChild = NextPeer; + } + } + if (PrevPeer) { + PrevPeer->NextPeer = NextPeer; + } + if (NextPeer) { + NextPeer->PrevPeer = PrevPeer; } - PrevPeer->NextPeer = NextPeer; - NextPeer->PrevPeer = PrevPeer; // Destroy value/children Clear(); @@ -332,6 +351,20 @@ bool CDataMember::Delete( const char * Path ) } //--------------------------------------------------------------------------- +bool CDataMember::SetValuePtr( EDataType pType, const char * pValue, int pLen ) +{ + Clear(); + Type = pType; + + if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) + { + Len = (pLen == -1)? strlen(pValue) : pLen; + Value = (char*)pValue; + } + return true; +} +//--------------------------------------------------------------------------- + bool CDataMember::SetValue( EDataType pType, const char * pValue, int pLen ) { Clear(); diff --git a/DataTreeCore.h b/DataTreeCore.h index 38dfdc2..4017b56 100644 --- a/DataTreeCore.h +++ b/DataTreeCore.h @@ -41,7 +41,8 @@ class CDataMember CDataMember * CreateChild( const char * Name, const int Len = -1 ); // Set Member value - bool SetValue( EDataType Type, const char * Value = NULL, int Len = -1 ); + bool SetValue( EDataType Type, const char * Value = NULL, int Len = -1 ); + bool SetValuePtr( EDataType pType, const char * pValue, int pLen = -1 ); public: CDataMember( const char * pName = NULL, const int pLen = -1 ); diff --git a/JSONparseCore.cpp b/JSONparseCore.cpp index 2271ad1..cc30c44 100644 --- a/JSONparseCore.cpp +++ b/JSONparseCore.cpp @@ -681,7 +681,7 @@ bool CJSONparse::ParseString( CDataMember * Member ) } // Set string - Member->SetValue( jtString, Value, Len ); + Member->SetValuePtr( jtString, Value, Len ); return true; } //--------------------------------------------------------------------------- @@ -712,7 +712,7 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member ) // Check for primitive values if ((Len == 4) && !strncasecmp( Mark, "null", 4 )) { - Member->SetValue( jtNull, NULL, -1 ); + Member->SetValue( jtNull ); } else if ((Len == 4) && !strncasecmp( Mark, "true", 4 )) { Member->SetValue( jtBool, "1" ); @@ -727,7 +727,7 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member ) Value = (char*)malloc( Len+1 ); memcpy( Value, Mark, Len ); Value[Len] = 0; - Member->SetValue( jtInt, Value, Len ); + Member->SetValuePtr( jtInt, Value, Len ); } else { // Try conversion to float @@ -736,7 +736,7 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member ) Value = (char*)malloc( Len+1 ); memcpy( Value, Mark, Len ); Value[Len] = 0; - Member->SetValue( jtFloat, Value, Len ); + Member->SetValuePtr( jtFloat, Value, Len ); } else { Error = true;