From 7fd0c1eb309df20724e83876eb5e81af536f1a4a Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sat, 16 Aug 2008 22:39:01 +0000 Subject: [PATCH] Merge aicom-network-fixes up to 35398 svn path=/trunk/; revision=35399 --- reactos/drivers/network/afd/afd/context.c | 15 +++++++++------ reactos/drivers/network/afd/afd/info.c | 15 ++++++--------- reactos/drivers/network/afd/afd/listen.c | 11 +++++++++-- reactos/drivers/network/afd/afd/lock.c | 4 ++-- reactos/drivers/network/afd/afd/main.c | 8 ++++++-- reactos/drivers/network/tcpip/tcpip/irp.c | 4 ++-- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/reactos/drivers/network/afd/afd/context.c b/reactos/drivers/network/afd/afd/context.c index 18744884ed0..9796a1c8db5 100644 --- a/reactos/drivers/network/afd/afd/context.c +++ b/reactos/drivers/network/afd/afd/context.c @@ -39,27 +39,30 @@ AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, NTSTATUS STDCALL AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { - NTSTATUS Status = STATUS_NO_MEMORY; + NTSTATUS Status = STATUS_BUFFER_TOO_SMALL; PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); + if( FCB->Context ) { + ExFreePool( FCB->Context ); + FCB->Context = NULL; + } + if( FCB->ContextSize < IrpSp->Parameters.DeviceIoControl.InputBufferLength ) { - if( FCB->Context ) - ExFreePool( FCB->Context ); FCB->Context = ExAllocatePool ( PagedPool, IrpSp->Parameters.DeviceIoControl.InputBufferLength ); - } - if( FCB->Context ) { - Status = STATUS_SUCCESS; + if( !FCB->Context ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0, NULL ); + RtlCopyMemory( FCB->Context, IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, IrpSp->Parameters.DeviceIoControl.InputBufferLength ); + Status = STATUS_SUCCESS; } AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status)); diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index 9a3ead68093..5e233ef80a2 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -24,12 +24,9 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, AFD_DbgPrint(MID_TRACE,("Called %x %x\n", InfoReq, InfoReq ? InfoReq->InformationClass : 0)); - _SEH_TRY { - if( !SocketAcquireStateLock( FCB ) ) { - Status = LostSocket( Irp ); - _SEH_YIELD(return Status); - } + if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); + _SEH_TRY { switch( InfoReq->InformationClass ) { case AFD_INFO_RECEIVE_WINDOW_SIZE: InfoReq->Information.Ulong = FCB->Recv.Size; @@ -113,7 +110,7 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, TDI_QUERY_ADDRESS_INFO, Mdl ); } else { - if( !NT_SUCCESS + if( NT_SUCCESS ( Status = TdiBuildNullConnectionInfo ( &ConnInfo, FCB->LocalAddress->Address[0].AddressType ) ) ) { @@ -148,11 +145,11 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, if( ConnInfo ) ExFreePool( ConnInfo ); if( SysMdl ) IoFreeMdl( SysMdl ); + if( TransAddr ) MmUnmapLockedPages( TransAddr, Mdl ); } + /* MmUnlockPages( Mdl ); */ } - - /* MmUnlockPages( Mdl ); */ - /* IoFreeMdl( Mdl ); */ + /* IoFreeMdl( Mdl ); */ } else { Status = STATUS_INSUFFICIENT_RESOURCES; } diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index 63d4b359f30..fbd73b97479 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -188,8 +188,6 @@ NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); - FCB->State = SOCKET_STATE_LISTENING; - TdiBuildNullConnectionInfo ( &FCB->ListenIrp.ConnectionCallInfo, FCB->LocalAddress->Address[0].AddressType ); @@ -197,6 +195,11 @@ NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, ( &FCB->ListenIrp.ConnectionReturnInfo, FCB->LocalAddress->Address[0].AddressType ); + if( !FCB->ListenIrp.ConnectionReturnInfo || !FCB->ListenIrp.ConnectionCallInfo ) + return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0, NULL ); + + FCB->State = SOCKET_STATE_LISTENING; + Status = TdiListen( &FCB->ListenIrp.InFlightRequest, FCB->Connection.Object, &FCB->ListenIrp.ConnectionCallInfo, @@ -272,6 +275,8 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, ( &FCB->ListenIrp.ConnectionReturnInfo, FCB->LocalAddress->Address[0].AddressType ); + if( !FCB->ListenIrp.ConnectionReturnInfo ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0, NULL ); + Status = TdiListen( &FCB->ListenIrp.InFlightRequest, FCB->Connection.Object, &FCB->ListenIrp.ConnectionCallInfo, @@ -306,6 +311,8 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, (PVOID *)&NewFileObject, NULL ); + if( !NT_SUCCESS(Status) ) UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); + ASSERT(NewFileObject != FileObject); ASSERT(NewFileObject->FsContext != FCB); diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 43f0633614c..d63fb56a2b8 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -167,7 +167,7 @@ UINT SocketAcquireStateLock( PAFD_FCB FCB ) { NTSTATUS Status = STATUS_SUCCESS; PVOID CurrentThread = KeGetCurrentThread(); - ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + ASSERT(KeGetCurrentIrql() <= APC_LEVEL); AFD_DbgPrint(MAX_TRACE,("Called on %x, attempting to lock\n", FCB)); @@ -218,7 +218,7 @@ VOID SocketStateUnlock( PAFD_FCB FCB ) { PVOID CurrentThread = KeGetCurrentThread(); #endif ASSERT(FCB->LockCount > 0); - ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + ASSERT(KeGetCurrentIrql() <= APC_LEVEL); ExAcquireFastMutex( &FCB->Mutex ); FCB->LockCount--; diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index a689ce56098..ae461883196 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -210,8 +210,12 @@ VOID DestroySocket( PAFD_FCB FCB ) { ExFreePool( FCB->LocalAddress ); if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress ); - - ExFreePool(FCB->TdiDeviceName.Buffer); + if( FCB->ListenIrp.ConnectionReturnInfo ) + ExFreePool( FCB->ListenIrp.ConnectionReturnInfo ); + if( FCB->ListenIrp.ConnectionCallInfo ) + ExFreePool( FCB->ListenIrp.ConnectionCallInfo ); + if( FCB->TdiDeviceName.Buffer ) + ExFreePool(FCB->TdiDeviceName.Buffer); ExFreePool(FCB); AFD_DbgPrint(MIN_TRACE,("Deleted (%x)\n", FCB)); diff --git a/reactos/drivers/network/tcpip/tcpip/irp.c b/reactos/drivers/network/tcpip/tcpip/irp.c index 0ba3bfb5ab5..da0e95e890c 100644 --- a/reactos/drivers/network/tcpip/tcpip/irp.c +++ b/reactos/drivers/network/tcpip/tcpip/irp.c @@ -27,14 +27,14 @@ NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) { UntrackFL( __FILE__, __LINE__, Irp ); #endif - (void)IoSetCancelRoutine( Irp, NULL ); + Irp->IoStatus.Status = Status; if( Status == STATUS_PENDING ) IoMarkIrpPending( Irp ); else { - Irp->IoStatus.Status = Status; Irql = KeGetCurrentIrql(); + (void)IoSetCancelRoutine( Irp, NULL ); IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); if (KeGetCurrentIrql() != Irql) { DbgPrint("WARNING: IO COMPLETION RETURNED AT WRONG IRQL:\n");