Add missing memory release to fix memory leak 42/317842/7
authorJiyong <jiyong.min@samsung.com>
Thu, 9 Jan 2025 00:28:03 +0000 (09:28 +0900)
committerJiyong <jiyong.min@samsung.com>
Thu, 9 Jan 2025 23:15:11 +0000 (08:15 +0900)
Change-Id: Iabf59702ee1ef9dcd5bb8dc48d0b80cd5adfc71d

src/heif_extractor.c
src/heif_itemtable.c

index 4dcf431d69b566975ac5974d1704a4723db99079..5309d65c8ccf179760491a70d6ccfb992d65ccdf 100644 (file)
@@ -44,7 +44,7 @@ static int __extractor_read_brandset(heif_extractor_t *extractor, off_t offset,
 int heif_extractor_extract(heif_source_h source, heif_itemtable_h *item_table)
 {
        int ret = LIBHEIF_ERROR_NONE;
-       heif_extractor_t *_extractor = NULL;
+       g_autofree heif_extractor_t *_extractor = NULL;
 
        heif_retvm_if_failed(source, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid source");
        heif_retvm_if_failed(item_table, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid item_table");
@@ -57,20 +57,12 @@ int heif_extractor_extract(heif_source_h source, heif_itemtable_h *item_table)
        ret = __extractor_read_metadata(_extractor);
        if (ret != LIBHEIF_ERROR_NONE) {
                heif_error("__extractor_read_metadata fail %d", ret);
-               g_free(_extractor);
                return ret;
        }
 
-       if (_extractor->is_heic) {
-               *item_table = _extractor->item_table;
-       } else {
-               heif_itemtable_destroy(_extractor->item_table);
-               ret = LIBHEIF_ERROR_INVALID_PARAMETER;
-       }
+       *item_table = _extractor->item_table;
 
-       g_free(_extractor);
-
-       return ret;
+       return LIBHEIF_ERROR_NONE;
 }
 
 static gint __extractor_compare_brand(gconstpointer data, gconstpointer user_data)
@@ -201,8 +193,6 @@ static int __extractor_parse_chunk(heif_extractor_t *extractor, off_t *offset, u
                ret = heif_itemtable_parse(extractor->item_table, chunk_type, data_offset, chunk_data_size);
                if (ret != LIBHEIF_ERROR_NONE) {
                        heif_error("heif_itemtable_parse fail %d", ret);
-                       heif_itemtable_destroy(extractor->item_table);
-                       extractor->item_table = NULL;
                        return ret;
                }
 
@@ -260,6 +250,11 @@ static int __extractor_read_metadata(heif_extractor_t *extractor)
                }
        }
 
+       if (ret != LIBHEIF_ERROR_NONE) {
+               heif_itemtable_destroy(extractor->item_table);
+               extractor->item_table = NULL;
+       }
+
        heif_debug_fleave();
 
        return ret;
index 0ca8b4cba746737b23801057335531ddc5e5d284..0285d57fb9c9567040a65ae024b2b4c5e7851a5e 100644 (file)
@@ -121,6 +121,7 @@ static int __heif_itemtable_parse_iprp_box(heif_itemtable_t *item_table, off_t o
 static int __heif_itemtable_parse_pitm_box(heif_itemtable_t *item_table, off_t offset, size_t size);
 static int __heif_itemtable_parse_idat_box(heif_itemtable_t *item_table, off_t offset, size_t size);
 static int __heif_itemtable_parse_iref_box(heif_itemtable_t *item_table, off_t offset, size_t size);
+static void __free_image_item(gpointer data);
 
 
 int heif_itemtable_create(heif_itemtable_h *handle, heif_source_h source)
@@ -484,7 +485,7 @@ void heif_itemtable_destroy(heif_itemtable_h handle)
 
        // release item table resource
        g_slist_free(item_table->displayables);
-       g_slist_free_full(item_table->image_items, g_free);
+       g_slist_free_full(item_table->image_items, __free_image_item);
        g_slist_free_full(item_table->exif_items, g_free);
 
        g_free(handle);
@@ -1333,3 +1334,13 @@ END:
 
        return __build_image_if_possible(item_table);
 }
+
+static void __free_image_item(gpointer data)
+{
+       _image_item_t *image_item = (_image_item_t *)data;
+
+       heif_retm_if_failed(data);
+
+       g_free(image_item->hvc_config.nal_unit.data);
+       g_free(image_item);
+}