]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
Sync the bug that list node is free before it is removed from the list. That made...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / SockImpl.c
index a7fa3b627a5e8e5ed811a5c61c224e598f6a078c..46c6ba492cbd7d3598dfde983a7a3d70d9dd372c 100644 (file)
@@ -563,6 +563,7 @@ SockCreate (
 \r
   ASSERT (SockInitData && SockInitData->ProtoHandler);\r
   ASSERT (SockInitData->Type == SOCK_STREAM);\r
+  ASSERT (SockInitData->ProtoData && (SockInitData->DataSize <= PROTO_RESERVED_LEN));\r
 \r
   Parent = SockInitData->Parent;\r
 \r
@@ -619,6 +620,9 @@ SockCreate (
   Sock->Type                = SockInitData->Type;\r
   Sock->DriverBinding       = SockInitData->DriverBinding;\r
   Sock->State               = SockInitData->State;\r
+  Sock->CreateCallback      = SockInitData->CreateCallback;\r
+  Sock->DestroyCallback     = SockInitData->DestroyCallback;\r
+  Sock->Context             = SockInitData->Context;\r
 \r
   Sock->SockError           = EFI_ABORTED;\r
   Sock->SndBuffer.LowWater  = SOCK_BUFF_LOW_WATER;\r
@@ -633,6 +637,11 @@ SockCreate (
     sizeof (EFI_TCP4_PROTOCOL)\r
     );\r
 \r
+  //\r
+  // copy the protodata into socket\r
+  //\r
+  NetCopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize);\r
+\r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &Sock->SockHandle,\r
                   &gEfiTcp4ProtocolGuid,\r
@@ -663,22 +672,36 @@ SockCreate (
     NetListInsertTail (&Parent->ConnectionList, &Sock->ConnectionList);\r
   }\r
 \r
+  if (Sock->CreateCallback != NULL) {\r
+    Status = Sock->CreateCallback (Sock, Sock->Context);\r
+    if (EFI_ERROR (Status)) {\r
+      goto OnError;\r
+    }\r
+  }\r
+\r
   return Sock;\r
 \r
 OnError:\r
-  if (NULL != Sock) {\r
 \r
-    if (NULL != Sock->SndBuffer.DataQueue) {\r
-      NetbufQueFree (Sock->SndBuffer.DataQueue);\r
-    }\r
+  if (Sock->SockHandle != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           Sock->SockHandle,\r
+           &gEfiTcp4ProtocolGuid,\r
+           &(Sock->NetProtocol.TcpProtocol),\r
+           NULL\r
+           );\r
+  }\r
 \r
-    if (NULL != Sock->RcvBuffer.DataQueue) {\r
-      NetbufQueFree (Sock->RcvBuffer.DataQueue);\r
-    }\r
+  if (NULL != Sock->SndBuffer.DataQueue) {\r
+    NetbufQueFree (Sock->SndBuffer.DataQueue);\r
+  }\r
 \r
-    NetFreePool (Sock);\r
+  if (NULL != Sock->RcvBuffer.DataQueue) {\r
+    NetbufQueFree (Sock->RcvBuffer.DataQueue);\r
   }\r
 \r
+  NetFreePool (Sock);\r
+\r
   return NULL;\r
 }\r
 \r
@@ -702,6 +725,10 @@ SockDestroy (
 \r
   ASSERT (SOCK_STREAM == Sock->Type);\r
 \r
+  if (Sock->DestroyCallback != NULL) {\r
+    Sock->DestroyCallback (Sock, Sock->Context);\r
+  }\r
+\r
   //\r
   // Flush the completion token buffered\r
   // by sock and rcv, snd buffer\r
@@ -888,6 +915,11 @@ SockClone (
   InitData.SndBufferSize  = Sock->SndBuffer.HighWater;\r
   InitData.DriverBinding  = Sock->DriverBinding;\r
   InitData.Protocol       = &(Sock->NetProtocol);\r
+  InitData.CreateCallback  = Sock->CreateCallback;\r
+  InitData.DestroyCallback = Sock->DestroyCallback;\r
+  InitData.Context         = Sock->Context;\r
+  InitData.ProtoData       = Sock->ProtoReserved;\r
+  InitData.DataSize        = sizeof (Sock->ProtoReserved);\r
 \r
   ClonedSock              = SockCreate (&InitData);\r
 \r
@@ -896,12 +928,6 @@ SockClone (
     return NULL;\r
   }\r
 \r
-  NetCopyMem (\r
-    ClonedSock->ProtoReserved,\r
-    Sock->ProtoReserved,\r
-    PROTO_RESERVED_LEN\r
-    );\r
-\r
   SockSetState (ClonedSock, SO_CONNECTING);\r
   ClonedSock->ConfigureState = Sock->ConfigureState;\r
 \r