Bugfix from w3seek : bug 1614 Fix resource leak in NtRemoveIoCompletion

svn path=/trunk/; revision=22506
This commit is contained in:
Magnus Olsen 2006-06-22 20:30:49 +00:00
parent 8579c127f7
commit 1e42e69d3d

View file

@ -279,7 +279,7 @@ NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle,
_SEH_TRY { _SEH_TRY {
*IoCompletionHandle = hIoCompletionHandle; *IoCompletionHandle = hIoCompletionHandle;
} _SEH_HANDLE { } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) {
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
} _SEH_END; } _SEH_END;
@ -332,7 +332,7 @@ NtOpenIoCompletion(OUT PHANDLE IoCompletionHandle,
_SEH_TRY { _SEH_TRY {
*IoCompletionHandle = hIoCompletionHandle; *IoCompletionHandle = hIoCompletionHandle;
} _SEH_HANDLE { } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) {
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
} _SEH_END; } _SEH_END;
@ -393,7 +393,7 @@ NtQueryIoCompletion(IN HANDLE IoCompletionHandle,
*ResultLength = sizeof(IO_COMPLETION_BASIC_INFORMATION); *ResultLength = sizeof(IO_COMPLETION_BASIC_INFORMATION);
} }
} _SEH_HANDLE { } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) {
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
} _SEH_END; } _SEH_END;
@ -472,34 +472,40 @@ NtRemoveIoCompletion(IN HANDLE IoCompletionHandle,
/* Get the Packet Data */ /* Get the Packet Data */
Packet = CONTAINING_RECORD(ListEntry, IO_COMPLETION_PACKET, ListEntry); Packet = CONTAINING_RECORD(ListEntry, IO_COMPLETION_PACKET, ListEntry);
_SEH_TRY { /* Check if this is piggybacked on an IRP */
if (Packet->PacketType == IrpCompletionPacket)
{
/* Get the IRP */
PIRP Irp = NULL;
Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.ListEntry);
/* Return values to user */
_SEH_TRY {
/* Check if this is piggybacked on an IRP */
if (Packet->PacketType == IrpCompletionPacket)
{
/* Get the IRP */
PIRP Irp = NULL;
Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.ListEntry);
/* Return values to user */
*CompletionKey = Irp->Tail.CompletionKey; *CompletionKey = Irp->Tail.CompletionKey;
*CompletionContext = Irp->Overlay.AsynchronousParameters.UserApcContext; *CompletionContext = Irp->Overlay.AsynchronousParameters.UserApcContext;
*IoStatusBlock = Packet->IoStatus; *IoStatusBlock = Packet->IoStatus;
IoFreeIrp(Irp); } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) {
}
else Status = _SEH_GetExceptionCode();
{ } _SEH_END;
/* This is a user-mode generated or API generated mini-packet */
IoFreeIrp(Irp);
}
else
{
/* This is a user-mode generated or API generated mini-packet */
_SEH_TRY {
*CompletionKey = Packet->Key; *CompletionKey = Packet->Key;
*CompletionContext = Packet->Context; *CompletionContext = Packet->Context;
*IoStatusBlock = Packet->IoStatus; *IoStatusBlock = Packet->IoStatus;
IopFreeIoCompletionPacket(Packet); } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) {
} Status = _SEH_GetExceptionCode();
} _SEH_END;
} _SEH_HANDLE { IopFreeIoCompletionPacket(Packet);
}
Status = _SEH_GetExceptionCode();
} _SEH_END;
} }
/* Dereference the Object */ /* Dereference the Object */