From 1e42e69d3d7e91687eee1392d09a43488c028597 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Thu, 22 Jun 2006 20:30:49 +0000 Subject: [PATCH] Bugfix from w3seek : bug 1614 Fix resource leak in NtRemoveIoCompletion svn path=/trunk/; revision=22506 --- reactos/ntoskrnl/io/iocomp.c | 52 ++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/reactos/ntoskrnl/io/iocomp.c b/reactos/ntoskrnl/io/iocomp.c index 446ba0b7fea..51bcdf73c3f 100644 --- a/reactos/ntoskrnl/io/iocomp.c +++ b/reactos/ntoskrnl/io/iocomp.c @@ -279,7 +279,7 @@ NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle, _SEH_TRY { *IoCompletionHandle = hIoCompletionHandle; - } _SEH_HANDLE { + } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { Status = _SEH_GetExceptionCode(); } _SEH_END; @@ -332,7 +332,7 @@ NtOpenIoCompletion(OUT PHANDLE IoCompletionHandle, _SEH_TRY { *IoCompletionHandle = hIoCompletionHandle; - } _SEH_HANDLE { + } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { Status = _SEH_GetExceptionCode(); } _SEH_END; @@ -393,7 +393,7 @@ NtQueryIoCompletion(IN HANDLE IoCompletionHandle, *ResultLength = sizeof(IO_COMPLETION_BASIC_INFORMATION); } - } _SEH_HANDLE { + } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { Status = _SEH_GetExceptionCode(); } _SEH_END; @@ -472,34 +472,40 @@ NtRemoveIoCompletion(IN HANDLE IoCompletionHandle, /* Get the Packet Data */ 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; *CompletionContext = Irp->Overlay.AsynchronousParameters.UserApcContext; *IoStatusBlock = Packet->IoStatus; - IoFreeIrp(Irp); - } - else - { - /* This is a user-mode generated or API generated mini-packet */ + } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { + + Status = _SEH_GetExceptionCode(); + } _SEH_END; + + IoFreeIrp(Irp); + } + else + { + /* This is a user-mode generated or API generated mini-packet */ + _SEH_TRY { + *CompletionKey = Packet->Key; *CompletionContext = Packet->Context; *IoStatusBlock = Packet->IoStatus; - IopFreeIoCompletionPacket(Packet); - } + } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { + Status = _SEH_GetExceptionCode(); + } _SEH_END; - } _SEH_HANDLE { - - Status = _SEH_GetExceptionCode(); - } _SEH_END; + IopFreeIoCompletionPacket(Packet); + } } /* Dereference the Object */