From 51388e8603f2249bc184792121f8279d6b75846c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 8 Aug 2011 22:02:55 +0000 Subject: [PATCH] [AFD] - Handle canceled reads on datagram sockets svn path=/trunk/; revision=53145 --- reactos/drivers/network/afd/afd/main.c | 24 ++++++++++-------------- reactos/drivers/network/afd/afd/read.c | 6 ++++++ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index 5ddebd2ae94..fa7f2bd5187 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -693,23 +693,19 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, /* Mark that we can't issue another receive request */ FCB->TdiReceiveClosed = TRUE; - /* These are only for connection-oriented sockets */ - if (!(FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS)) - { - /* Try to cancel a pending TDI receive IRP if there was one in progress */ - if (FCB->ReceiveIrp.InFlightRequest) - IoCancelIrp(FCB->ReceiveIrp.InFlightRequest); + /* Try to cancel a pending TDI receive IRP if there was one in progress */ + if (FCB->ReceiveIrp.InFlightRequest) + IoCancelIrp(FCB->ReceiveIrp.InFlightRequest); - /* Discard any pending data */ - FCB->Recv.Content = 0; - FCB->Recv.BytesUsed = 0; + /* Discard any pending data */ + FCB->Recv.Content = 0; + FCB->Recv.BytesUsed = 0; - /* Mark us as overread to complete future reads with an error */ - FCB->Overread = TRUE; + /* Mark us as overread to complete future reads with an error */ + FCB->Overread = TRUE; - /* Set a successful close status to indicate a shutdown on overread */ - FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS; - } + /* Set a successful close status to indicate a shutdown on overread */ + FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS; /* Clear the receive event */ FCB->PollState &= ~AFD_EVENT_RECEIVE; diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index c9e19de6255..05f1c3ee571 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -588,6 +588,12 @@ PacketSocketRecvComplete( return Irp->IoStatus.Status; } + if (FCB->TdiReceiveClosed) + { + SocketStateUnlock(FCB); + return STATUS_FILE_CLOSED; + } + DatagramRecv = ExAllocatePool( NonPagedPool, DGSize ); if( DatagramRecv ) {