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:
vanjeff
2008-01-29 08:47:42 +00:00
parent 7a372cf045
commit 4f6e31e47b
6 changed files with 219 additions and 163 deletions

View File

@ -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;