Author: cgutman Date: Mon Aug 10 23:21:50 2009 New Revision: 42604
URL: http://svn.reactos.org/svn/reactos?rev=42604&view=rev Log: - Make Connect IRPs cancellable (should fix some deadlock issues) - Fix a bug which could result in a Listen IRP being unable to be cancelled
Modified: trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
Modified: trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip... ============================================================================== --- trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] Mon Aug 10 23:21:50 2009 @@ -192,6 +192,10 @@ DGRemoveIRP(TranContext->Handle.AddressHandle, Irp); break;
+ case TDI_CONNECT: + TCPRemoveIRP(TranContext->Handle.ConnectionContext, Irp); + break; + default: TI_DbgPrint(MIN_TRACE, ("Unknown IRP. MinorFunction (0x%X).\n", MinorFunction)); break; @@ -399,12 +403,18 @@
Parameters = (PTDI_REQUEST_KERNEL)&IrpSp->Parameters;
- Status = TCPConnect( - TranContext->Handle.ConnectionContext, - Parameters->RequestConnectionInformation, - Parameters->ReturnConnectionInformation, - DispDataRequestComplete, - Irp ); + Status = DispPrepareIrpForCancel(TranContext->Handle.ConnectionContext, + Irp, + DispCancelRequest); + + if (NT_SUCCESS(Status)) { + Status = TCPConnect( + TranContext->Handle.ConnectionContext, + Parameters->RequestConnectionInformation, + Parameters->ReturnConnectionInformation, + DispDataRequestComplete, + Irp ); + }
done: TcpipRecursiveMutexLeave( &TCPLock ); @@ -577,12 +587,17 @@ Connection->AddressFile->Listener)); }
+ Status = DispPrepareIrpForCancel + (TranContext->Handle.ConnectionContext, + Irp, + (PDRIVER_CANCEL)DispCancelListenRequest); + /* Listening will require us to create a listening socket and store it in * the address file. It will be signalled, and attempt to complete an irp * when a new connection arrives. */ /* The important thing to note here is that the irp we'll complete belongs * to the socket to be accepted onto, not the listener */ - if( !Connection->AddressFile->Listener ) { + if( NT_SUCCESS(Status) && !Connection->AddressFile->Listener ) { Connection->AddressFile->Listener = TCPAllocateConnectionEndpoint( NULL );
@@ -602,12 +617,6 @@ if( NT_SUCCESS(Status) ) Status = TCPListen( Connection->AddressFile->Listener, 1024 ); /* BACKLOG */ - } - if( NT_SUCCESS(Status) ) { - Status = DispPrepareIrpForCancel - (TranContext->Handle.ConnectionContext, - Irp, - (PDRIVER_CANCEL)DispCancelListenRequest); }
if( NT_SUCCESS(Status) ) {