fixed crash in string map
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 2 Oct 2014 11:39:19 +0000 (14:39 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 2 Oct 2014 11:39:19 +0000 (14:39 +0300)
include/nms_util.h
src/libnetxms/strmap.cpp
src/libnetxms/strmapbase.cpp

index c660caf..646b7a7 100644 (file)
@@ -414,7 +414,6 @@ struct KeyValuePair
 class LIBNETXMS_EXPORTABLE StringMapBase
 {
 protected:
-       int m_size;
    StringMapEntry *m_data;
        bool m_objectOwner;
    bool m_ignoreCase;
@@ -435,7 +434,7 @@ public:
        void remove(const TCHAR *key);
        void clear();
 
-       int size() { return m_size; }
+       int size();
    bool contains(const TCHAR *key) { return find(key) != NULL; }
 
    bool forEach(bool (*cb)(const TCHAR *, const void *, void *), void *userData);
index 14ea880..a3f19d4 100644 (file)
@@ -29,7 +29,6 @@
  */
 StringMap::StringMap(const StringMap &src) : StringMapBase(true)
 {
-       m_size = 0;
        m_objectOwner = src.m_objectOwner;
    m_ignoreCase = src.m_ignoreCase;
    m_objectDestructor = src.m_objectDestructor;
@@ -121,7 +120,7 @@ bool StringMap::getBoolean(const TCHAR *key, bool defaultValue)
  */
 void StringMap::fillMessage(CSCPMessage *msg, UINT32 sizeFieldId, UINT32 baseFieldId)
 {
-   msg->SetVariable(sizeFieldId, (UINT32)m_size);
+   msg->SetVariable(sizeFieldId, (UINT32)size());
    UINT32 id = baseFieldId;
    StringMapEntry *entry, *tmp;
    HASH_ITER(hh, m_data, entry, tmp)
index ca87288..358d7aa 100644 (file)
@@ -41,7 +41,6 @@ static void ObjectDestructor(void *object)
  */
 StringMapBase::StringMapBase(bool objectOwner)
 {
-       m_size = 0;
        m_data = NULL;
        m_objectOwner = objectOwner;
    m_ignoreCase = true;
@@ -69,7 +68,6 @@ void StringMapBase::clear()
       destroyObject(entry->value);
       free(entry);
    }
-       m_size = 0;
 }
 
 /**
@@ -122,7 +120,6 @@ void StringMapBase::setObject(TCHAR *key, void *value, bool keyPreAllocated)
       int keyLen = (int)(_tcslen(key) * sizeof(TCHAR));
       entry->value = value;
       HASH_ADD_KEYPTR(hh, m_data, entry->key, keyLen, entry);
-               m_size++;
        }
 }
 
@@ -143,11 +140,11 @@ void StringMapBase::remove(const TCHAR *key)
    StringMapEntry *entry = find(key);
    if (entry != NULL)
    {
+      HASH_DEL(m_data, entry);
       free(entry->key);
                if (m_objectOwner)
          destroyObject(entry->value);
       free(entry);
-      m_size--;
    }
 }
 
@@ -193,7 +190,7 @@ const void *StringMapBase::findElement(bool (*comparator)(const TCHAR *, const v
  */
 StructArray<KeyValuePair> *StringMapBase::toArray()
 {
-   StructArray<KeyValuePair> *a = new StructArray<KeyValuePair>(m_size);
+   StructArray<KeyValuePair> *a = new StructArray<KeyValuePair>(size());
    StringMapEntry *entry, *tmp;
    HASH_ITER(hh, m_data, entry, tmp)
    {
@@ -204,3 +201,11 @@ StructArray<KeyValuePair> *StringMapBase::toArray()
    }
    return a;
 }
+
+/**
+ * Get size
+ */
+int StringMapBase::size()
+{
+   return HASH_COUNT(m_data);
+}