summaryrefslogtreecommitdiff
path: root/network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp
diff options
context:
space:
mode:
authorDHarper89936 <[email protected]>2019-08-26 11:16:03 -0700
committerAdonais Romero González <[email protected]>2019-08-26 11:16:03 -0700
commit45ffe35cb1f098cc25c68bd521b68af34cc354cc (patch)
tree3cc6111064e8c94de5fdc3879213dee6bb7d22bd /network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp
parent4057314f5582f76ece8f97b236014f462e505f21 (diff)
Fix potential deadlock due to unregistering callouts during a PowerState callback (#408)79745
Moves the unregister of callouts into a workitem routine. Additionally fixed an issue which could potentially leak an IOWorkItem
Diffstat (limited to 'network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp')
-rw-r--r--network/trans/WFPSampler/syslib/HelperFunctions_WorkItems.cpp65
1 files changed, 50 insertions, 15 deletions
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