From bfa583a9aa2acae53c6f7b3d903f689710a6e0c3 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 10 Oct 2018 14:34:55 -0700 Subject: [PATCH] Guard OnAsyncCompletion from completing request before OnExecuteRequestHandler exits (#1489) --- src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp | 8 ++++++++ src/AspNetCoreModuleV2/AspNetCore/proxymodule.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp index 7467c81b21..38eaf08c31 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp +++ b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp @@ -7,6 +7,7 @@ #include "applicationinfo.h" #include "exceptions.h" #include "DisconnectHandler.h" +#include "SRWExclusiveLock.h" extern BOOL g_fInShutdown; @@ -67,6 +68,7 @@ ASPNET_CORE_PROXY_MODULE::ASPNET_CORE_PROXY_MODULE(HTTP_MODULE_ID moduleId, std: m_moduleId(moduleId), m_pDisconnectHandler(nullptr) { + InitializeSRWLock(&m_requestLock); } ASPNET_CORE_PROXY_MODULE::~ASPNET_CORE_PROXY_MODULE() @@ -84,6 +86,9 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( HRESULT hr = S_OK; REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; + // We don't want OnAsyncCompletion to complete request before OnExecuteRequestHandler exits + auto lock = SRWExclusiveLock(m_requestLock); + try { if (g_fInShutdown) @@ -134,6 +139,9 @@ ASPNET_CORE_PROXY_MODULE::OnAsyncCompletion( IHttpCompletionInfo * pCompletionInfo ) { + // We don't want OnAsyncCompletion to complete request before OnExecuteRequestHandler exits + auto lock = SRWExclusiveLock(m_requestLock); + try { return HandleNotificationStatus(m_pHandler->OnAsyncCompletion( diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h index c5b290a36e..8f5b680e36 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h +++ b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h @@ -60,6 +60,7 @@ class ASPNET_CORE_PROXY_MODULE : NonCopyable, public CHttpModule std::unique_ptr m_pHandler; HTTP_MODULE_ID m_moduleId; DisconnectHandler * m_pDisconnectHandler; + SRWLOCK m_requestLock {}; }; class ASPNET_CORE_PROXY_MODULE_FACTORY : NonCopyable, public IHttpModuleFactory