From 45ffe35cb1f098cc25c68bd521b68af34cc354cc Mon Sep 17 00:00:00 2001 From: DHarper89936 Date: Mon, 26 Aug 2019 11:16:03 -0700 Subject: Fix potential deadlock due to unregistering callouts during a PowerState callback (#408) Moves the unregister of callouts into a workitem routine. Additionally fixed an issue which could potentially leak an IOWorkItem --- .../syslib/HelperFunctions_WorkItems.cpp | 65 +++++++++++++++++----- 1 file changed, 50 insertions(+), 15 deletions(-) (limited to 'network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp') diff --git a/network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp b/network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp index 4c47f3b3..23f4a6df 100644 --- a/network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp +++ b/network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp @@ -843,9 +843,16 @@ NTSTATUS KrnlHlprWorkItemQueue(_In_ PDEVICE_OBJECT pWDMDevice, HLPR_BAIL_LABEL: - if(status != STATUS_SUCCESS && - pWorkItemData) - KrnlHlprWorkItemDataDestroy(&pWorkItemData); + if(status != STATUS_SUCCESS) + { + if(pWorkItemData) + KrnlHlprWorkItemDataDestroy(&pWorkItemData); + else + { + if(pIOWorkItem) + IoFreeWorkItem(pIOWorkItem); + } + } #if DBG @@ -929,9 +936,16 @@ NTSTATUS KrnlHlprWorkItemQueue(_In_ PDEVICE_OBJECT pWDMDevice, HLPR_BAIL_LABEL: - if(status != STATUS_SUCCESS && - pWorkItemData) - KrnlHlprWorkItemDataDestroy(&pWorkItemData); + if(status != STATUS_SUCCESS) + { + if(pWorkItemData) + KrnlHlprWorkItemDataDestroy(&pWorkItemData); + else + { + if(pIOWorkItem) + IoFreeWorkItem(pIOWorkItem); + } + } #if DBG @@ -1015,9 +1029,16 @@ NTSTATUS KrnlHlprWorkItemQueue(_In_ PDEVICE_OBJECT pWDMDevice, HLPR_BAIL_LABEL: - if(status != STATUS_SUCCESS && - pWorkItemData) - KrnlHlprWorkItemDataDestroy(&pWorkItemData); + if(status != STATUS_SUCCESS) + { + if(pWorkItemData) + KrnlHlprWorkItemDataDestroy(&pWorkItemData); + else + { + if(pIOWorkItem) + IoFreeWorkItem(pIOWorkItem); + } + } #if DBG @@ -1098,9 +1119,16 @@ NTSTATUS KrnlHlprWorkItemQueue(_In_ PDEVICE_OBJECT pWDMDevice, HLPR_BAIL_LABEL: - if(status != STATUS_SUCCESS && - pWorkItemData) - KrnlHlprWorkItemDataDestroy(&pWorkItemData); + if(status != STATUS_SUCCESS) + { + if(pWorkItemData) + KrnlHlprWorkItemDataDestroy(&pWorkItemData); + else + { + if(pIOWorkItem) + IoFreeWorkItem(pIOWorkItem); + } + } #if DBG @@ -1181,9 +1209,16 @@ NTSTATUS KrnlHlprWorkItemQueue(_In_ PDEVICE_OBJECT pWDMDevice, HLPR_BAIL_LABEL: - if(status != STATUS_SUCCESS && - pWorkItemData) - KrnlHlprWorkItemDataDestroy(&pWorkItemData); + if(status != STATUS_SUCCESS) + { + if(pWorkItemData) + KrnlHlprWorkItemDataDestroy(&pWorkItemData); + else + { + if(pIOWorkItem) + IoFreeWorkItem(pIOWorkItem); + } + } #if DBG -- cgit v1.3.1