]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
1.Fix a bug in Dhcp4Dxe driver to correct the ‘secs’ field in DHCP message.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcImpl.c
index 4ea15a6314f508222b6b33a0ef18e14af78e3c41..6f6d7f92ae58a797e1a181f2357b4190f9a60782 100644 (file)
@@ -1024,6 +1024,7 @@ EfiPxeBcDiscover (
     } else {\r
       Status = EFI_DEVICE_ERROR;\r
     }\r
+    return Status;\r
   } else {\r
     PxeBcParseCachedDhcpPacket (&Private->PxeReply);\r
   }\r
@@ -1278,6 +1279,10 @@ EfiPxeBcMtftp (
     Mode->IcmpErrorReceived = TRUE;\r
   }\r
 \r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
   Status = Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);\r
   //\r
   // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP \r
@@ -1626,7 +1631,13 @@ EfiPxeBcUdpRead (
   EFI_STATUS                Status;\r
   BOOLEAN                   IsDone;\r
   BOOLEAN                   Matched;\r
-  UINTN                     CopyLen;\r
+  UINTN                     CopiedLen;\r
+  UINTN                     HeaderLen;\r
+  UINTN                     HeaderCopiedLen;\r
+  UINTN                     BufferCopiedLen;\r
+  UINT32                    FragmentLength;\r
+  UINTN                     FragmentIndex;\r
+  UINT8                     *FragmentBuffer;\r
 \r
   if (This == NULL || DestIp == NULL || DestPort == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1783,26 +1794,51 @@ TRY_AGAIN:
     }\r
 \r
     if (Matched) {\r
+      ASSERT (RxData != NULL);\r
 \r
-      CopyLen = 0;\r
-\r
+      HeaderLen = 0;\r
       if (HeaderSize != NULL) {\r
-        CopyLen = MIN (*HeaderSize, RxData->DataLength);\r
-        CopyMem (HeaderPtr, RxData->FragmentTable[0].FragmentBuffer, CopyLen);\r
-        *HeaderSize = CopyLen;\r
+        HeaderLen = MIN (*HeaderSize, RxData->DataLength);\r
       }\r
 \r
-      if (RxData->DataLength - CopyLen > *BufferSize) {\r
-\r
+      if (RxData->DataLength - HeaderLen > *BufferSize) {\r
         Status = EFI_BUFFER_TOO_SMALL;\r
       } else {\r
-\r
-        *BufferSize = RxData->DataLength - CopyLen;\r
-        CopyMem (\r
-          BufferPtr,\r
-          (UINT8 *) RxData->FragmentTable[0].FragmentBuffer + CopyLen,\r
-          *BufferSize\r
-          );\r
+        *HeaderSize = HeaderLen;\r
+        *BufferSize = RxData->DataLength - HeaderLen;\r
+\r
+        HeaderCopiedLen = 0;\r
+        BufferCopiedLen = 0;\r
+        for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; FragmentIndex++) {\r
+          FragmentLength = RxData->FragmentTable[FragmentIndex].FragmentLength;\r
+          FragmentBuffer = RxData->FragmentTable[FragmentIndex].FragmentBuffer;\r
+          if (HeaderCopiedLen + FragmentLength < HeaderLen) {\r
+            //\r
+            // Copy the header part of received data.\r
+            //\r
+            CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, FragmentLength);\r
+            HeaderCopiedLen += FragmentLength;\r
+          } else if (HeaderCopiedLen < HeaderLen) {\r
+            //\r
+            // Copy the header part of received data.\r
+            //\r
+            CopiedLen = HeaderLen - HeaderCopiedLen;\r
+            CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, CopiedLen);\r
+            HeaderCopiedLen += CopiedLen;\r
+\r
+            //\r
+            // Copy the other part of received data.\r
+            //\r
+            CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + CopiedLen, FragmentLength - CopiedLen);\r
+            BufferCopiedLen += (FragmentLength - CopiedLen);\r
+          } else {\r
+            //\r
+            // Copy the other part of received data.\r
+            //\r
+            CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, FragmentLength);\r
+            BufferCopiedLen += FragmentLength;\r
+          }\r
+        }\r
       }\r
     } else {\r
 \r