Nikolay Sivov : mfplat: Fix EndCreateObject*() when events are used.

Alexandre Julliard julliard at winehq.org
Fri Mar 29 16:27:41 CDT 2019


Module: wine
Branch: master
Commit: 663af65eb9fb8576139641313015633331c33fbc
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=663af65eb9fb8576139641313015633331c33fbc

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Mar 29 14:46:52 2019 +0300

mfplat: Fix EndCreateObject*() when events are used.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

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

diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index c6cf471..4444e49 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -4259,6 +4259,7 @@ struct resolver_queued_result
     IUnknown *object;
     MF_OBJECT_TYPE obj_type;
     HRESULT hr;
+    IMFAsyncResult *inner_result;
     enum resolved_object_origin origin;
 };
 
@@ -4313,7 +4314,7 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
         IMFSchemeHandler *scheme_handler;
     } handler;
 
-    queued_result = heap_alloc(sizeof(*queued_result));
+    queued_result = heap_alloc_zero(sizeof(*queued_result));
 
     IMFAsyncResult_GetObject(inner_result, &handler.handler);
 
@@ -4337,6 +4338,12 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
     {
         MFASYNCRESULT *data = (MFASYNCRESULT *)inner_result;
 
+        if (data->hEvent)
+        {
+            queued_result->inner_result = inner_result;
+            IMFAsyncResult_AddRef(queued_result->inner_result);
+        }
+
         /* Push resolved object type and created object, so we don't have to guess on End*() call. */
         EnterCriticalSection(&resolver->cs);
         list_add_tail(&resolver->pending, &queued_result->entry);
@@ -4687,7 +4694,7 @@ static HRESULT resolver_end_create_object(struct source_resolver *resolver, enum
 
     LIST_FOR_EACH_ENTRY(iter, &resolver->pending, struct resolver_queued_result, entry)
     {
-        if (iter->object == object && iter->origin == origin)
+        if (iter->inner_result == result || (iter->object == object && iter->origin == origin))
         {
             list_remove(&iter->entry);
             queued_result = iter;
@@ -4704,6 +4711,8 @@ static HRESULT resolver_end_create_object(struct source_resolver *resolver, enum
         *out = queued_result->object;
         *obj_type = queued_result->obj_type;
         hr = queued_result->hr;
+        if (queued_result->inner_result)
+            IMFAsyncResult_Release(queued_result->inner_result);
         heap_free(queued_result);
     }
     else




More information about the wine-cvs mailing list