Edje data: Fix memory leak in nested data descriptors
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 18 Nov 2015 02:32:37 +0000 (11:32 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 18 Nov 2015 02:48:44 +0000 (11:48 +0900)
src/lib/eet/eet_data.c

index a0c5864..ad2fe47 100644 (file)
@@ -191,6 +191,7 @@ struct _Eet_Data_Element
    int                  counter_offset;  /* for a variable array we need the offset of the count variable */
    unsigned char        type;  /* EET_T_XXX */
    unsigned char        group_type;  /* EET_G_XXX */
+   Eina_Bool            subtype_free : 1;
 };
 
 struct _Eet_Data_Encode_Hash_Info
@@ -2108,7 +2109,15 @@ eet_data_descriptor_free(Eet_Data_Descriptor *edd)
 
    _eet_descriptor_hash_free(edd);
    if (edd->elements.set)
-     free(edd->elements.set);
+     {
+        int i;
+        for (i = 0; i < edd->elements.num; i++)
+          {
+             if (edd->elements.set[i].subtype_free)
+               eet_data_descriptor_free(edd->elements.set[i].subtype);
+          }
+        free(edd->elements.set);
+     }
 
    free(edd);
 }
@@ -2200,6 +2209,7 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
    ede = &(edd->elements.set[edd->elements.num - 1]);
    ede->name = name;
    ede->directory_name_ptr = NULL;
+   ede->subtype_free = EINA_FALSE;
 
    /*
     * We do a special case when we do list,hash or whatever group of simple type.
@@ -2229,6 +2239,7 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
                                         /* 0,  */ NULL,
                                         NULL);
         type = EET_T_UNKNOW;
+        ede->subtype_free = EINA_TRUE;
      }
 
    ede->type = type;