Skip to content

Commit 609171f

Browse files
committed
[AFD]
- Fix signaling socket termination events on disconnect - Fixes bug 4951 svn path=/trunk/; revision=47156
1 parent 7335bf8 commit 609171f

File tree

1 file changed

+49
-21
lines changed
  • reactos/drivers/network/afd/afd

1 file changed

+49
-21
lines changed

reactos/drivers/network/afd/afd/read.c

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,38 @@
2626
#include "tdiconn.h"
2727
#include "debug.h"
2828

29-
static BOOLEAN CantReadMore( PAFD_FCB FCB ) {
30-
UINT BytesAvailable = FCB->Recv.Content - FCB->Recv.BytesUsed;
29+
static NTSTATUS RefillSocketBuffer( PAFD_FCB FCB ) {
30+
NTSTATUS Status = STATUS_PENDING;
31+
32+
if( !FCB->ReceiveIrp.InFlightRequest ) {
33+
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
34+
35+
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
36+
FCB->Connection.Object,
37+
TDI_RECEIVE_NORMAL,
38+
FCB->Recv.Window,
39+
FCB->Recv.Size,
40+
&FCB->ReceiveIrp.Iosb,
41+
ReceiveComplete,
42+
FCB );
43+
44+
if( ( Status == STATUS_SUCCESS && !FCB->ReceiveIrp.Iosb.Information ) ||
45+
( !NT_SUCCESS( Status ) ) )
46+
{
47+
/* The socket has been closed */
48+
FCB->PollState |= AFD_EVENT_DISCONNECT;
49+
FCB->Overread = TRUE;
50+
Status = STATUS_FILE_CLOSED;
51+
}
52+
else if( Status == STATUS_SUCCESS )
53+
{
54+
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
55+
FCB->PollState |= AFD_EVENT_RECEIVE;
56+
}
57+
PollReeval( FCB->DeviceExt, FCB->FileObject );
58+
}
3159

32-
return !BytesAvailable;
60+
return Status;
3361
}
3462

3563
static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
@@ -46,7 +74,22 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
4674
AFD_DbgPrint(MID_TRACE,("Called, BytesAvailable = %d\n",
4775
BytesAvailable));
4876

49-
if( CantReadMore(FCB) ) return STATUS_PENDING;
77+
if( FCB->Overread ) return STATUS_FILE_CLOSED;
78+
if( !BytesAvailable ) {
79+
FCB->Recv.Content = FCB->Recv.BytesUsed = 0;
80+
Status = RefillSocketBuffer( FCB );
81+
if ( Status != STATUS_SUCCESS )
82+
return Status;
83+
84+
/* If RefillSocketBuffer returns STATUS_SUCCESS, we're good to go
85+
* If RefillSocketBuffer returns STATUS_PENDING, then it's waiting on the transport for data
86+
* If RefillSocketBuffer returns STATUS_FILE_CLOSED, then the connection was terminated
87+
*/
88+
89+
/* Recalculate BytesAvailable based on new data */
90+
BytesAvailable = FCB->Recv.Content - FCB->Recv.BytesUsed;
91+
ASSERT(BytesAvailable);
92+
}
5093

5194
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + RecvReq->BufferCount);
5295

@@ -88,23 +131,8 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
88131
if( FCB->Recv.BytesUsed == FCB->Recv.Content ) {
89132
FCB->Recv.BytesUsed = FCB->Recv.Content = 0;
90133
FCB->PollState &= ~AFD_EVENT_RECEIVE;
91-
PollReeval( FCB->DeviceExt, FCB->FileObject );
92134

93-
if( !FCB->ReceiveIrp.InFlightRequest ) {
94-
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
95-
96-
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
97-
FCB->Connection.Object,
98-
TDI_RECEIVE_NORMAL,
99-
FCB->Recv.Window,
100-
FCB->Recv.Size,
101-
&FCB->ReceiveIrp.Iosb,
102-
ReceiveComplete,
103-
FCB );
104-
105-
if( Status == STATUS_SUCCESS )
106-
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
107-
}
135+
RefillSocketBuffer( FCB );
108136
}
109137

110138
return STATUS_SUCCESS;
@@ -159,7 +187,7 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
159187
}
160188
}
161189

162-
if( !CantReadMore(FCB) ) {
190+
if( !FCB->Recv.Content ) {
163191
FCB->PollState |= AFD_EVENT_RECEIVE;
164192
} else
165193
FCB->PollState &= ~AFD_EVENT_RECEIVE;

0 commit comments

Comments
 (0)