summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
diff options
context:
space:
mode:
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>2008-01-29 08:47:42 +0000
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>2008-01-29 08:47:42 +0000
commit4f6e31e47bc014da5055fa03779888d87c5e4c2a (patch)
treef87852509f5a6b7fb41eed36cd0f795b27835fdb /MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
parent7a372cf045d44f7653e5a34e2ad3cc4cde572c5b (diff)
downloadedk2-4f6e31e47bc014da5055fa03779888d87c5e4c2a.tar.gz
edk2-4f6e31e47bc014da5055fa03779888d87c5e4c2a.tar.bz2
edk2-4f6e31e47bc014da5055fa03779888d87c5e4c2a.zip
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
Diffstat (limited to 'MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c')
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c54
1 files changed, 40 insertions, 14 deletions
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
index a7fa3b627a..46c6ba492c 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
@@ -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 (Sock->SockHandle != NULL) {
+ gBS->UninstallMultipleProtocolInterfaces (
+ Sock->SockHandle,
+ &gEfiTcp4ProtocolGuid,
+ &(Sock->NetProtocol.TcpProtocol),
+ NULL
+ );
+ }
- if (NULL != Sock->RcvBuffer.DataQueue) {
- NetbufQueFree (Sock->RcvBuffer.DataQueue);
- }
+ if (NULL != Sock->SndBuffer.DataQueue) {
+ NetbufQueFree (Sock->SndBuffer.DataQueue);
+ }
- NetFreePool (Sock);
+ 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;