From ec2494433b72173f4314d638418413fe4a8fe913 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 13 May 2016 10:37:25 -0700 Subject: [PATCH] launcher: fix deadlock when SvcPipeServer stops itself --- src/launcher/launcher.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index af8fc225..c8b22c06 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -455,6 +455,7 @@ NTSTATUS SvcInstanceGetNameList(HANDLE ClientToken, } static HANDLE SvcThread, SvcEvent; +static DWORD SvcThreadId; static HANDLE SvcPipe = INVALID_HANDLE_VALUE; static OVERLAPPED SvcOverlapped; @@ -491,7 +492,7 @@ static NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) if (INVALID_HANDLE_VALUE == SvcPipe) goto fail; - SvcThread = CreateThread(0, 0, SvcPipeServer, Service, 0, 0); + SvcThread = CreateThread(0, 0, SvcPipeServer, Service, 0, &SvcThreadId); if (0 == SvcThread) goto fail; @@ -523,9 +524,12 @@ fail: static NTSTATUS SvcStop(FSP_SERVICE *Service) { - SetEvent(SvcEvent); - FspServiceRequestTime(Service, 4500); /* just under 5 sec */ - WaitForSingleObject(SvcThread, 4500); + if (GetCurrentThreadId() != SvcThreadId) + { + SetEvent(SvcEvent); + FspServiceRequestTime(Service, 4500); /* just under 5 sec */ + WaitForSingleObject(SvcThread, 4500); + } if (0 != SvcThread) CloseHandle(SvcThread);