[PATCH 1/3] mfplat: Read queue subscriber within the critical section.

Rémi Bernon rbernon at codeweavers.com
Mon Apr 12 11:36:02 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---

This should fix a few leaks and potential race condition.

I'm not 100% sure about the last patch, as there's some questions about
who's supposed to be shuting down the object. I think we set the
_MF_TOPONODE_IMFActivate node when we activated the object, and after
we called IMFTopologyNode_SetObject, so my understanding is that when
they are set we should shutdown both the activation object and the
object itself.

For the sample grabber, the tests show that shutting down the activation
object should not automatically shutdown the sink, so it needs to be
done separately.

 dlls/mfplat/main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 6fb8661dba4..9078702c854 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -7109,7 +7109,7 @@ static void queue_notify_subscriber(struct event_queue *queue)
 static HRESULT WINAPI eventqueue_BeginGetEvent(IMFMediaEventQueue *iface, IMFAsyncCallback *callback, IUnknown *state)
 {
     struct event_queue *queue = impl_from_IMFMediaEventQueue(iface);
-    MFASYNCRESULT *result_data = (MFASYNCRESULT *)queue->subscriber;
+    MFASYNCRESULT *result_data;
     HRESULT hr;
 
     TRACE("%p, %p, %p.\n", iface, callback, state);
@@ -7121,7 +7121,7 @@ static HRESULT WINAPI eventqueue_BeginGetEvent(IMFMediaEventQueue *iface, IMFAsy
 
     if (queue->is_shut_down)
         hr = MF_E_SHUTDOWN;
-    else if (result_data)
+    else if ((result_data = (MFASYNCRESULT *)queue->subscriber))
     {
         if (result_data->pCallback == callback)
             hr = IRtwqAsyncResult_GetStateNoAddRef(queue->subscriber) == state ?
-- 
2.31.0




More information about the wine-devel mailing list