fix resource leak 00/271500/3 accepted/tizen_7.0_unified_hotfix tizen_7.0_hotfix accepted/tizen/7.0/unified/hotfix/20221116.105404 accepted/tizen/unified/20220303.131821 submit/tizen/20220302.013359 tizen_7.0_m2_release
authorjiyong.min <jiyong.min@samsung.com>
Tue, 22 Feb 2022 06:33:36 +0000 (15:33 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Tue, 1 Mar 2022 23:18:34 +0000 (08:18 +0900)
 If 'pkt_buf' is not allocated, '_pkt' variable leaks.

Change-Id: I0cc81d29df0edbffc828d322204c96af3fb00dc1

packaging/libheif.spec
src/heif_decode_ffmpeg.c

index b4cc810..d5b8617 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libheif
 Summary:    Multimedia Framework Library for HEIF(ISO/IEC 23008-12) image
-Version:    0.0.6
+Version:    0.0.7
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 5a2b37b..29a2c36 100644 (file)
@@ -128,9 +128,9 @@ static int __ffmpeg_get_image_from_frame(AVFrame *frame, heif_color_format_e col
                goto FAIL;
        }
 
+       // use libswscale to transform the frame into an image of wanted format
        img_convert_ctx = sws_getContext(frame->width, frame->height, frame->format, frame->width, frame->height, pix_fmt, SWS_BICUBIC, NULL, NULL, NULL);
-
-       if (NULL == img_convert_ctx) {
+       if (!img_convert_ctx) {
                heif_error("sws_getContext fail");
                goto FAIL;
        }
@@ -164,23 +164,31 @@ static int __ffmpeg_packet_alloc_from_data(AVPacket **pkt, heif_buffer_t *media_
        heif_retvm_if_failed(media_data->data, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid media_data->data");
        heif_retvm_if_failed(media_data->size > 0, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid media_data->size");
 
+       // the packet should be released by av_packet_unref or av_packet_free
        _pkt = av_packet_alloc();
        heif_retvm_if_failed(_pkt, LIBHEIF_ERROR_INVALID_OPERATION, "av_packet_alloc fail");
 
-       // this buffer should be released by av_packet_unref or av_packet_free
        pkt_buf = av_memdup(media_data->data, media_data->size);
-       heif_retvm_if_failed(pkt_buf, LIBHEIF_ERROR_INVALID_OPERATION, "av_memdup fail");
+       if (!pkt_buf) {
+               heif_error("av_memdup fail");
+               goto FAIL;
+       }
 
        if (av_packet_from_data(_pkt, pkt_buf, media_data->size) < 0) {
                heif_error("av_packet_from_data fail");
-               g_free(pkt_buf);
-               av_packet_free(&_pkt);
-               return LIBHEIF_ERROR_INVALID_OPERATION;
+               goto FAIL;
        }
 
        *pkt = _pkt;
 
        return LIBHEIF_ERROR_NONE;
+
+FAIL:
+       if (pkt_buf)
+               av_free(pkt_buf);
+       av_packet_free(&_pkt);
+
+       return LIBHEIF_ERROR_INVALID_OPERATION;
 }
 
 static int __ffmpeg_get_decoder(int codec_id, _ffmpeg_decoder_t *decoder)
@@ -218,7 +226,8 @@ static int __ffmpeg_get_decoder(int codec_id, _ffmpeg_decoder_t *decoder)
 
        // hevc decoder doesn't support any other fmt.
        decoder->ctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
-       decoder->ctx->thread_count = 1; // sw decoding should set '1' because ffmpeg is thread-unsafety
+       // sw decoding should set '1' because ffmpeg is thread-unsafety
+       decoder->ctx->thread_count = 1;
 
        heif_debug_fleave();