From 258f1161f3f0e0aecb858dfb1132470774f33e61 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 3 Apr 2009 05:31:00 +0000 Subject: [PATCH] - RapidSVN doesn't figure out that when I right click afd that I want EVERYTHING changed in afd to be commited ;) svn path=/trunk/; revision=40342 --- reactos/drivers/network/afd/afd/listen.c | 25 ++++++++++++++++++++++-- reactos/drivers/network/afd/afd/read.c | 11 ++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index c17febd670b..50002a7eaa4 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -95,7 +95,7 @@ static NTSTATUS NTAPI ListenComplete NTSTATUS Status = STATUS_SUCCESS; PAFD_FCB FCB = (PAFD_FCB)Context; PAFD_TDI_OBJECT_QELT Qelt; - PLIST_ENTRY NextIrpEntry; + PLIST_ENTRY NextIrpEntry, QeltEntry; PIRP NextIrp; if( !SocketAcquireStateLock( FCB ) ) { @@ -116,6 +116,27 @@ static NTSTATUS NTAPI ListenComplete if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) ); IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT ); } + + /* Free all pending connections */ + while( !IsListEmpty( &FCB->PendingConnections ) ) { + QeltEntry = RemoveHeadList(&FCB->PendingConnections); + Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry); + ExFreePool(Qelt); + } + + /* Free ConnectionReturnInfo and ConnectionCallInfo */ + if (FCB->ListenIrp.ConnectionReturnInfo) + { + ExFreePool(FCB->ListenIrp.ConnectionReturnInfo); + FCB->ListenIrp.ConnectionReturnInfo = NULL; + } + + if (FCB->ListenIrp.ConnectionCallInfo) + { + ExFreePool(FCB->ListenIrp.ConnectionCallInfo); + FCB->ListenIrp.ConnectionCallInfo = NULL; + } + SocketStateUnlock( FCB ); return STATUS_FILE_CLOSED; } @@ -381,7 +402,7 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, (PVOID *)&NewFileObject, NULL ); - if( !NT_SUCCESS(Status) ) UnlockAndMaybeComplete( FCB, Status, Irp, 0 ); + if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0 ); ASSERT(NewFileObject != FileObject); ASSERT(NewFileObject->FsContext != FCB); diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index 35b79dee765..96f20d8937c 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -460,7 +460,7 @@ PacketSocketRecvComplete( PAFD_RECV_INFO RecvReq; PAFD_STORED_DATAGRAM DatagramRecv; UINT DGSize = Irp->IoStatus.Information + sizeof( AFD_STORED_DATAGRAM ); - PLIST_ENTRY NextIrpEntry; + PLIST_ENTRY NextIrpEntry, DatagramRecvEntry; AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); @@ -485,6 +485,15 @@ PacketSocketRecvComplete( if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) ); IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT ); } + + /* Free all items on the datagram list */ + while( !IsListEmpty( &FCB->DatagramList ) ) { + DatagramRecvEntry = RemoveHeadList(&FCB->DatagramList); + DatagramRecv = CONTAINING_RECORD(DatagramRecvEntry, AFD_STORED_DATAGRAM, ListEntry); + ExFreePool( DatagramRecv->Address ); + ExFreePool( DatagramRecv ); + } + SocketStateUnlock( FCB ); return STATUS_FILE_CLOSED; }