Skip to content

Commit 131cace

Browse files
authored
Fix Order of TCP Accept and Receive Operations (#4256)
1 parent 47a1254 commit 131cace

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/platform/datapath_winuser.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2564,6 +2564,7 @@ CxPlatDataPathSocketProcessAcceptCompletion(
25642564
{
25652565
CXPLAT_SOCKET_PROC* ListenerSocketProc = CONTAINING_RECORD(Sqe, CXPLAT_SOCKET_PROC, IoSqe);
25662566
ULONG IoResult = RtlNtStatusToDosError((NTSTATUS)Cqe->Internal);
2567+
CXPLAT_SOCKET_PROC* AcceptSocketProc = NULL;
25672568

25682569
if (IoResult == WSAENOTSOCK || IoResult == WSA_OPERATION_ABORTED) {
25692570
//
@@ -2579,7 +2580,7 @@ CxPlatDataPathSocketProcessAcceptCompletion(
25792580

25802581
if (IoResult == QUIC_STATUS_SUCCESS) {
25812582
CXPLAT_DBG_ASSERT(ListenerSocketProc->AcceptSocket != NULL);
2582-
CXPLAT_SOCKET_PROC* AcceptSocketProc = &ListenerSocketProc->AcceptSocket->PerProcSockets[0];
2583+
AcceptSocketProc = &ListenerSocketProc->AcceptSocket->PerProcSockets[0];
25832584
CXPLAT_DBG_ASSERT(ListenerSocketProc->AcceptSocket == AcceptSocketProc->Parent);
25842585
DWORD BytesReturned;
25852586
SOCKET_PROCESSOR_AFFINITY RssAffinity = { 0 };
@@ -2592,6 +2593,11 @@ CxPlatDataPathSocketProcessAcceptCompletion(
25922593
0,
25932594
"AcceptEx Completed!");
25942595

2596+
2597+
if (!CxPlatRundownAcquire(&AcceptSocketProc->RundownRef)) {
2598+
goto Error;
2599+
}
2600+
25952601
int Result =
25962602
setsockopt(
25972603
AcceptSocketProc->Socket,
@@ -2646,16 +2652,16 @@ CxPlatDataPathSocketProcessAcceptCompletion(
26462652
goto Error;
26472653
}
26482654

2649-
CxPlatDataPathStartReceiveAsync(AcceptSocketProc);
2650-
2651-
AcceptSocketProc->IoStarted = TRUE;
26522655
Datapath->TcpHandlers.Accept(
26532656
ListenerSocketProc->Parent,
26542657
ListenerSocketProc->Parent->ClientContext,
26552658
ListenerSocketProc->AcceptSocket,
26562659
&ListenerSocketProc->AcceptSocket->ClientContext);
26572660
ListenerSocketProc->AcceptSocket = NULL;
26582661

2662+
AcceptSocketProc->IoStarted = TRUE;
2663+
CxPlatDataPathStartReceiveAsync(AcceptSocketProc);
2664+
26592665
} else {
26602666
QuicTraceEvent(
26612667
DatapathErrorStatus,
@@ -2667,6 +2673,10 @@ CxPlatDataPathSocketProcessAcceptCompletion(
26672673

26682674
Error:
26692675

2676+
if (AcceptSocketProc != NULL) {
2677+
CxPlatRundownRelease(&AcceptSocketProc->RundownRef);
2678+
}
2679+
26702680
if (ListenerSocketProc->AcceptSocket != NULL) {
26712681
SocketDelete(ListenerSocketProc->AcceptSocket);
26722682
ListenerSocketProc->AcceptSocket = NULL;

0 commit comments

Comments
 (0)