From 3b171f70afadb62b33d55a6b127c7c1f785ed9b6 Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Thu, 29 Aug 2019 15:28:36 +0800 Subject: [PATCH] msdk: fix memory leaks in msdk allocators --- sys/msdk/gstmsdksystemmemory.c | 11 ++++++++++- sys/msdk/gstmsdkvideomemory.c | 13 ++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/sys/msdk/gstmsdksystemmemory.c b/sys/msdk/gstmsdksystemmemory.c index 6b7900f..80f689f 100644 --- a/sys/msdk/gstmsdksystemmemory.c +++ b/sys/msdk/gstmsdksystemmemory.c @@ -199,13 +199,21 @@ gst_msdk_system_memory_new (GstAllocator * base_allocator) mem->surface = gst_msdk_system_allocator_create_surface (base_allocator); + if (!mem->surface) { + g_slice_free (GstMsdkSystemMemory, mem); + return NULL; + } + vip = &allocator->image_info; gst_memory_init (&mem->parent_instance, 0, base_allocator, NULL, GST_VIDEO_INFO_SIZE (vip), 0, 0, GST_VIDEO_INFO_SIZE (vip)); - if (!ensure_data (mem)) + if (!ensure_data (mem)) { + g_slice_free (mfxFrameSurface1, mem->surface); + g_slice_free (GstMsdkSystemMemory, mem); return NULL; + } return GST_MEMORY_CAST (mem); } @@ -278,6 +286,7 @@ gst_msdk_system_allocator_free (GstAllocator * allocator, GstMemory * base_mem) _aligned_free (mem->cache); g_slice_free (mfxFrameSurface1, mem->surface); + g_slice_free (GstMsdkSystemMemory, mem); } static GstMemory * diff --git a/sys/msdk/gstmsdkvideomemory.c b/sys/msdk/gstmsdkvideomemory.c index a59b68f..6e173fa 100644 --- a/sys/msdk/gstmsdkvideomemory.c +++ b/sys/msdk/gstmsdkvideomemory.c @@ -166,8 +166,10 @@ gst_msdk_video_memory_new (GstAllocator * base_allocator) return NULL; mem->surface = gst_msdk_video_allocator_get_surface (base_allocator); - if (!mem->surface) + if (!mem->surface) { + g_slice_free (GstMsdkVideoMemory, mem); return NULL; + } vip = &allocator->image_info; gst_memory_init (&mem->parent_instance, 0, @@ -366,6 +368,14 @@ gst_msdk_video_allocator_finalize (GObject * object) } static void +gst_msdk_video_allocator_free (GstAllocator * allocator, GstMemory * base_mem) +{ + GstMsdkVideoMemory *const mem = GST_MSDK_VIDEO_MEMORY_CAST (base_mem); + + g_slice_free (GstMsdkVideoMemory, mem); +} + +static void gst_msdk_video_allocator_class_init (GstMsdkVideoAllocatorClass * klass) { GObjectClass *const object_class = G_OBJECT_CLASS (klass); @@ -374,6 +384,7 @@ gst_msdk_video_allocator_class_init (GstMsdkVideoAllocatorClass * klass) object_class->finalize = gst_msdk_video_allocator_finalize; allocator_class->alloc = gst_msdk_video_allocator_alloc; + allocator_class->free = gst_msdk_video_allocator_free; } static void -- 2.7.4