[PATCH 1/5] winegstreamer: Fix multiple leaks in failure pathes.

Derek Lesho dlesho at codeweavers.com
Wed Sep 1 16:05:54 CDT 2021


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
 dlls/winegstreamer/media_source.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 01ab626254a..383afcfce75 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -733,6 +733,9 @@ static HRESULT new_media_stream(struct media_source *source,
     object->IMFMediaStream_iface.lpVtbl = &media_stream_vtbl;
     object->ref = 1;
 
+    if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
+        goto fail;
+
     IMFMediaSource_AddRef(&source->IMFMediaSource_iface);
     object->parent_source = source;
     object->stream_id = stream_id;
@@ -741,9 +744,6 @@ static HRESULT new_media_stream(struct media_source *source,
     object->eos = FALSE;
     object->wg_stream = wg_stream;
 
-    if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
-        goto fail;
-
     TRACE("Created stream object %p.\n", object);
 
     *out_stream = object;
@@ -1211,7 +1211,8 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
 
     source->state = SOURCE_SHUTDOWN;
 
-    unix_funcs->wg_parser_disconnect(source->wg_parser);
+    if (source->stream_count)
+        unix_funcs->wg_parser_disconnect(source->wg_parser);
 
     if (source->read_thread)
     {
@@ -1231,6 +1232,9 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
     {
         struct media_stream *stream = source->streams[i];
 
+        if (!stream)
+            continue;
+
         stream->state = STREAM_SHUTDOWN;
 
         if (stream->event_queue)
@@ -1245,7 +1249,7 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
 
     unix_funcs->wg_parser_destroy(source->wg_parser);
 
-    if (source->stream_count)
+    if (source->streams)
         free(source->streams);
 
     if (source->async_commands_queue)
@@ -1353,7 +1357,6 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
         if (FAILED(hr = media_stream_init_desc(object->streams[i])))
         {
             ERR("Failed to finish initialization of media stream %p, hr %x.\n", object->streams[i], hr);
-            IMFMediaStream_Release(&object->streams[i]->IMFMediaStream_iface);
             goto fail;
         }
     }
@@ -1392,6 +1395,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
     fail:
     WARN("Failed to construct MFMediaSource, hr %#x.\n", hr);
 
+    if (object->wg_parser)
+        IMFMediaSource_Shutdown(&object->IMFMediaSource_iface);
     free(descriptors);
     IMFMediaSource_Release(&object->IMFMediaSource_iface);
     return hr;
-- 
2.33.0




More information about the wine-devel mailing list