[PATCH 1/3] winegstreamer: Duplicate source shutdown path into constructor with leak fixes.
Zebediah Figura
zfigura at codeweavers.com
Mon Sep 13 12:22:29 CDT 2021
On 9/10/21 12:04 PM, Derek Lesho wrote:
> @@ -857,6 +854,8 @@ done:
> IMFMediaTypeHandler_Release(type_handler);
> for (i = 0; i < type_count; i++)
> IMFMediaType_Release(stream_types[i]);
> + if (FAILED(hr))
> + IMFStreamDescriptor_Release(stream->descriptor);
> return hr;
> }
>
There are failure paths from media_stream_init_desc() with FAILED(hr) &&
!stream->descriptor.
...
> @@ -1392,8 +1385,40 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
> fail:
> WARN("Failed to construct MFMediaSource, hr %#x.\n", hr);
>
> - free(descriptors);
> - IMFMediaSource_Release(&object->IMFMediaSource_iface);
> + if (descriptors)
> + {
> + for(i = 0; i < object->stream_count; i++)
> + IMFStreamDescriptor_Release(descriptors[i]);
> + free(descriptors);
> + }
> + for (i = 0; i < object->stream_count; i++)
> + {
> + struct media_stream *stream = object->streams[i];
> +
> + IMFMediaEventQueue_Release(stream->event_queue);
> + IMFStreamDescriptor_Release(stream->descriptor);
> + IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
> +
> + free(stream);
> + }
> + if (object->streams)
> + free(object->streams);
As long as we're here, this if() is unnecessary.
> + if (stream_count)
> + unix_funcs->wg_parser_disconnect(object->wg_parser);
This doesn't work; the parser could have zero streams. Granted, that
usually means an error condition on the GStreamer side, but it's still
worth handling right.
> + if (object->read_thread)
> + {
> + object->read_thread_shutdown = true;
> + WaitForSingleObject(object->read_thread, INFINITE);
> + CloseHandle(object->read_thread);
> + }
> + if (object->wg_parser)
> + unix_funcs->wg_parser_destroy(object->wg_parser);
> + if (object->async_commands_queue)
> + MFUnlockWorkQueue(object->async_commands_queue);
> + if (object->event_queue)
> + IMFMediaEventQueue_Release(object->event_queue);
> + IMFByteStream_Release(object->byte_stream);
> + free(object);
> return hr;
> }
>
>
More information about the wine-devel
mailing list