]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. Fix bug in PXE driver UdpRead function to handle the IP fragmentation.
authorsfu5 <sfu5@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 9 Sep 2011 08:31:37 +0000 (08:31 +0000)
committersfu5 <sfu5@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 9 Sep 2011 08:31:37 +0000 (08:31 +0000)
Signed-off-by: sfu5
Reviewed-by: xdu2
Reviewed-by: hhuan13
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12309 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c

index dfdfd35cb76387fe751845478405875f2cc85a68..6f6d7f92ae58a797e1a181f2357b4190f9a60782 100644 (file)
@@ -1631,7 +1631,13 @@ EfiPxeBcUdpRead (
   EFI_STATUS                Status;\r
   BOOLEAN                   IsDone;\r
   BOOLEAN                   Matched;\r
   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
 \r
   if (This == NULL || DestIp == NULL || DestPort == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1788,26 +1794,51 @@ TRY_AGAIN:
     }\r
 \r
     if (Matched) {\r
     }\r
 \r
     if (Matched) {\r
+      ASSERT (RxData != NULL);\r
 \r
 \r
-      CopyLen = 0;\r
-\r
+      HeaderLen = 0;\r
       if (HeaderSize != NULL) {\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
       }\r
 \r
-      if (RxData->DataLength - CopyLen > *BufferSize) {\r
-\r
+      if (RxData->DataLength - HeaderLen > *BufferSize) {\r
         Status = EFI_BUFFER_TOO_SMALL;\r
       } else {\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
       }\r
     } else {\r
 \r