quartz: Use a safe APC to kill the PullPin thread when the PullPin is being released

Chris Robinson chris.kcat at gmail.com
Sat Mar 31 22:20:45 CDT 2007


-------------- next part --------------
From 886883dd82d74f7aac2932eaca011730358127ce Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat at gmail.com>
Date: Sat, 31 Mar 2007 20:13:08 -0700
Subject: [PATCH] quartz: Use a safe APC to kill the PullPin thread when the PullPin is being released
Prevents an invalid pointer deref the default APC stop method causes
---
 dlls/quartz/pin.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/dlls/quartz/pin.c b/dlls/quartz/pin.c
index 84a2c30..06313e4 100644
--- a/dlls/quartz/pin.c
+++ b/dlls/quartz/pin.c
@@ -1121,6 +1121,15 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const
     return hr;
 }
 
+static void CALLBACK PullPin_SafeThreadStop(ULONG_PTR handle)
+{
+    HANDLE hThread = (HANDLE)handle;
+
+    if (hThread)
+        CloseHandle(hThread);
+    ExitThread(0);
+}
+
 HRESULT WINAPI PullPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
 {
     PullPin *This = (PullPin *)iface;
@@ -1155,7 +1164,14 @@ ULONG WINAPI PullPin_Release(IPin * iface)
     if (!refCount)
     {
         if (This->hThread)
-            PullPin_StopProcessing(This);
+        {
+            HRESULT hr;
+
+            if (!QueueUserAPC(PullPin_SafeThreadStop, This->hThread, (ULONG_PTR)This->hThread))
+                ERR("Cannot stop PullPin thread (GetLastError() = %d)!", GetLastError());
+            if (This->pAlloc && FAILED(hr = IMemAllocator_Decommit(This->pAlloc)))
+                ERR("Allocator decommit failed with error %x. Possible memory leak\n", hr);
+        }
         if(This->pAlloc)
             IMemAllocator_Release(This->pAlloc);
         if(This->pReader)
-- 
1.4.4.4



More information about the wine-patches mailing list