Sync the bug that list node is free before it is removed from the list. That made the list invalid.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4641 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -563,6 +563,7 @@ SockCreate (
|
||||
|
||||
ASSERT (SockInitData && SockInitData->ProtoHandler);
|
||||
ASSERT (SockInitData->Type == SOCK_STREAM);
|
||||
ASSERT (SockInitData->ProtoData && (SockInitData->DataSize <= PROTO_RESERVED_LEN));
|
||||
|
||||
Parent = SockInitData->Parent;
|
||||
|
||||
@ -619,6 +620,9 @@ SockCreate (
|
||||
Sock->Type = SockInitData->Type;
|
||||
Sock->DriverBinding = SockInitData->DriverBinding;
|
||||
Sock->State = SockInitData->State;
|
||||
Sock->CreateCallback = SockInitData->CreateCallback;
|
||||
Sock->DestroyCallback = SockInitData->DestroyCallback;
|
||||
Sock->Context = SockInitData->Context;
|
||||
|
||||
Sock->SockError = EFI_ABORTED;
|
||||
Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER;
|
||||
@ -633,6 +637,11 @@ SockCreate (
|
||||
sizeof (EFI_TCP4_PROTOCOL)
|
||||
);
|
||||
|
||||
//
|
||||
// copy the protodata into socket
|
||||
//
|
||||
NetCopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize);
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&Sock->SockHandle,
|
||||
&gEfiTcp4ProtocolGuid,
|
||||
@ -663,22 +672,36 @@ SockCreate (
|
||||
NetListInsertTail (&Parent->ConnectionList, &Sock->ConnectionList);
|
||||
}
|
||||
|
||||
if (Sock->CreateCallback != NULL) {
|
||||
Status = Sock->CreateCallback (Sock, Sock->Context);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto OnError;
|
||||
}
|
||||
}
|
||||
|
||||
return Sock;
|
||||
|
||||
OnError:
|
||||
if (NULL != Sock) {
|
||||
|
||||
if (NULL != Sock->SndBuffer.DataQueue) {
|
||||
NetbufQueFree (Sock->SndBuffer.DataQueue);
|
||||
}
|
||||
|
||||
if (NULL != Sock->RcvBuffer.DataQueue) {
|
||||
NetbufQueFree (Sock->RcvBuffer.DataQueue);
|
||||
}
|
||||
|
||||
NetFreePool (Sock);
|
||||
if (Sock->SockHandle != NULL) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Sock->SockHandle,
|
||||
&gEfiTcp4ProtocolGuid,
|
||||
&(Sock->NetProtocol.TcpProtocol),
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
if (NULL != Sock->SndBuffer.DataQueue) {
|
||||
NetbufQueFree (Sock->SndBuffer.DataQueue);
|
||||
}
|
||||
|
||||
if (NULL != Sock->RcvBuffer.DataQueue) {
|
||||
NetbufQueFree (Sock->RcvBuffer.DataQueue);
|
||||
}
|
||||
|
||||
NetFreePool (Sock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -702,6 +725,10 @@ SockDestroy (
|
||||
|
||||
ASSERT (SOCK_STREAM == Sock->Type);
|
||||
|
||||
if (Sock->DestroyCallback != NULL) {
|
||||
Sock->DestroyCallback (Sock, Sock->Context);
|
||||
}
|
||||
|
||||
//
|
||||
// Flush the completion token buffered
|
||||
// by sock and rcv, snd buffer
|
||||
@ -888,6 +915,11 @@ SockClone (
|
||||
InitData.SndBufferSize = Sock->SndBuffer.HighWater;
|
||||
InitData.DriverBinding = Sock->DriverBinding;
|
||||
InitData.Protocol = &(Sock->NetProtocol);
|
||||
InitData.CreateCallback = Sock->CreateCallback;
|
||||
InitData.DestroyCallback = Sock->DestroyCallback;
|
||||
InitData.Context = Sock->Context;
|
||||
InitData.ProtoData = Sock->ProtoReserved;
|
||||
InitData.DataSize = sizeof (Sock->ProtoReserved);
|
||||
|
||||
ClonedSock = SockCreate (&InitData);
|
||||
|
||||
@ -896,12 +928,6 @@ SockClone (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NetCopyMem (
|
||||
ClonedSock->ProtoReserved,
|
||||
Sock->ProtoReserved,
|
||||
PROTO_RESERVED_LEN
|
||||
);
|
||||
|
||||
SockSetState (ClonedSock, SO_CONNECTING);
|
||||
ClonedSock->ConfigureState = Sock->ConfigureState;
|
||||
|
||||
|
Reference in New Issue
Block a user