diff --git a/reactos/drivers/network/afd/afd/connect.c b/reactos/drivers/network/afd/afd/connect.c index 4c02da62f56..5d4bddf4509 100644 --- a/reactos/drivers/network/afd/afd/connect.c +++ b/reactos/drivers/network/afd/afd/connect.c @@ -77,11 +77,6 @@ static NTSTATUS NTAPI StreamSocketConnectComplete AFD_DbgPrint(MID_TRACE,("Called: FCB %x, FO %x\n", Context, FCB->FileObject)); - if( Irp->Cancel ) { - if( FCB ) FCB->ConnectIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - /* I was wrong about this before as we can have pending writes to a not * yet connected socket */ if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; @@ -91,6 +86,11 @@ static NTSTATUS NTAPI StreamSocketConnectComplete FCB->ConnectIrp.InFlightRequest = NULL; + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + if( NT_SUCCESS(Irp->IoStatus.Status) ) { FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND; AFD_DbgPrint(MID_TRACE,("Going to connected state %d\n", FCB->State)); diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index 85a8bf2eeaf..530c9ddcb6a 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -102,15 +102,15 @@ static NTSTATUS NTAPI ListenComplete PAFD_FCB FCB = (PAFD_FCB)Context; PAFD_TDI_OBJECT_QELT Qelt; - if( Irp->Cancel ) { - if( FCB ) FCB->ListenIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; FCB->ListenIrp.InFlightRequest = NULL; + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB ); DestroySocket( FCB ); diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index 2271a986d89..365eafcabe8 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -234,14 +234,15 @@ NTSTATUS NTAPI ReceiveComplete ASSERT_IRQL(APC_LEVEL); - if( Irp->Cancel ) { - if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - if( !SocketAcquireStateLock( FCB ) ) return Status; FCB->ReceiveIrp.InFlightRequest = NULL; + + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + FCB->Recv.Content = Irp->IoStatus.Information; FCB->Recv.BytesUsed = 0; @@ -455,15 +456,15 @@ PacketSocketRecvComplete( AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); - if( Irp->Cancel ) { - if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; FCB->ReceiveIrp.InFlightRequest = NULL; + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB ); DestroySocket( FCB ); diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index a6bdd134427..bb326e575f3 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -40,16 +40,16 @@ static NTSTATUS NTAPI SendComplete ASSERT_IRQL(APC_LEVEL); - if( Irp->Cancel ) { - if( FCB ) FCB->SendIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - if( !SocketAcquireStateLock( FCB ) ) return Status; FCB->SendIrp.InFlightRequest = NULL; /* Request is not in flight any longer */ + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB ); DestroySocket( FCB ); @@ -176,20 +176,20 @@ static NTSTATUS NTAPI PacketSocketSendComplete Irp->IoStatus.Status, Irp->IoStatus.Information)); - if( Irp->Cancel ) { - if( FCB ) FCB->SendIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - /* It's ok if the FCB already died */ if( !SocketAcquireStateLock( FCB ) ) return STATUS_SUCCESS; - FCB->PollState |= AFD_EVENT_SEND; - PollReeval( FCB->DeviceExt, FCB->FileObject ); - FCB->SendIrp.InFlightRequest = NULL; /* Request is not in flight any longer */ + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + + FCB->PollState |= AFD_EVENT_SEND; + PollReeval( FCB->DeviceExt, FCB->FileObject ); + if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB ); DestroySocket( FCB ); diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c index f31e2299c0c..4ac97407ef5 100644 --- a/reactos/drivers/network/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c @@ -485,18 +485,22 @@ NTSTATUS DispTdiDisconnect( IrpSp = IoGetCurrentIrpStackLocation(Irp); DisReq = (PTDI_REQUEST_KERNEL_DISCONNECT)&IrpSp->Parameters; + TcpipRecursiveMutexEnter( &TCPLock, TRUE ); + /* Get associated connection endpoint file object. Quit if none exists */ TranContext = IrpSp->FileObject->FsContext; if (!TranContext) { TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); - return STATUS_INVALID_CONNECTION; + Status = STATUS_INVALID_CONNECTION; + goto done; } Connection = (PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext; if (!Connection) { TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n")); - return STATUS_INVALID_CONNECTION; + Status = STATUS_INVALID_CONNECTION; + goto done; } Status = TCPDisconnect( @@ -507,7 +511,15 @@ NTSTATUS DispTdiDisconnect( DispDataRequestComplete, Irp ); - TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status)); +done: + if (Status != STATUS_PENDING) { + DispDataRequestComplete(Irp, Status, 0); + } else + IoMarkIrpPending(Irp); + + TcpipRecursiveMutexLeave( &TCPLock ); + + TI_DbgPrint(MAX_TRACE, ("TCP Disconnect returned %08x\n", Status)); return Status; } @@ -1490,7 +1502,7 @@ NTSTATUS DispTdiSetInformationEx( TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - return IRPFinish(Irp, STATUS_INVALID_PARAMETER); + return Irp->IoStatus.Status; } Status = DispPrepareIrpForCancel(TranContext, Irp, NULL); diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c index 70c9df483b5..d5c94d7da0b 100644 --- a/reactos/drivers/network/tcpip/tcpip/main.c +++ b/reactos/drivers/network/tcpip/tcpip/main.c @@ -437,6 +437,7 @@ TiDispatchInternal( case TDI_DISCONNECT: Status = DispTdiDisconnect(Irp); + Complete = FALSE; break; case TDI_ASSOCIATE_ADDRESS: diff --git a/reactos/lib/drivers/ip/network/arp.c b/reactos/lib/drivers/ip/network/arp.c index 5c830589ca8..124ea51f97a 100644 --- a/reactos/lib/drivers/ip/network/arp.c +++ b/reactos/lib/drivers/ip/network/arp.c @@ -230,7 +230,7 @@ VOID ARPReceive( Header->HWAddrLen, NUD_REACHABLE); } - if (Header->Opcode != ARP_OPCODE_REQUEST) + if (Header->Opcode != ARP_OPCODE_REQUEST || !NCE) return; /* This is a request for our address. Swap the addresses and diff --git a/reactos/lib/drivers/ip/transport/datagram/datagram.c b/reactos/lib/drivers/ip/transport/datagram/datagram.c index 0b701338075..8f4d81ba1ba 100644 --- a/reactos/lib/drivers/ip/transport/datagram/datagram.c +++ b/reactos/lib/drivers/ip/transport/datagram/datagram.c @@ -254,6 +254,9 @@ NTSTATUS DGReceiveDatagram( { ReceiveRequest->RemotePort = 0; } + + IoMarkIrpPending(Irp); + ReceiveRequest->ReturnInfo = ReturnInfo; ReceiveRequest->Buffer = BufferData; ReceiveRequest->BufferSize = ReceiveLength;