]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.c
MdeModulePkg: Refine casting expression result to bigger size
[mirror_edk2.git] / MdeModulePkg / Universal / Network / ArpDxe / ArpImpl.c
index a3923d95bd8e006d161abb9363370f7887247d9e..a02de203c0770ebb544f1819475246077571bb05 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   The implementation of the ARP protocol.\r
   \r
-Copyright (c) 2006 - 2009, Intel Corporation.<BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at<BR>\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -52,7 +52,7 @@ ArpInitInstance (
   CopyMem (&Instance->ArpProto, &mEfiArpProtocolTemplate, sizeof (Instance->ArpProto));\r
 \r
   Instance->Configured = FALSE;\r
-  Instance->Destroyed  = FALSE;\r
+  Instance->InDestroy  = FALSE;\r
 \r
   InitializeListHead (&Instance->List);\r
 }\r
@@ -112,15 +112,28 @@ ArpOnFrameRcvdDpc (
   // Status is EFI_SUCCESS, process the received frame.\r
   //\r
   RxData = RxToken->Packet.RxData;\r
-  Head   = (ARP_HEAD *) RxData->PacketData;\r
+  //\r
+  // Sanity check.\r
+  //\r
+  if (RxData->DataLength < sizeof (ARP_HEAD)) {\r
+    //\r
+    // Restart the receiving if packet size is not correct.\r
+    //\r
+    goto RESTART_RECEIVE;\r
+  }\r
 \r
   //\r
   // Convert the byte order of the multi-byte fields.\r
   //\r
+  Head   = (ARP_HEAD *) RxData->PacketData;\r
   Head->HwType    = NTOHS (Head->HwType);\r
   Head->ProtoType = NTOHS (Head->ProtoType);\r
   Head->OpCode    = NTOHS (Head->OpCode);\r
 \r
+  if (RxData->DataLength < (sizeof (ARP_HEAD) + 2 * Head->HwAddrLen + 2 * Head->ProtoAddrLen)) {\r
+    goto RESTART_RECEIVE;\r
+  }\r
+\r
   if ((Head->HwType != ArpService->SnpMode.IfType) ||\r
     (Head->HwAddrLen != ArpService->SnpMode.HwAddressSize) ||\r
     (RxData->ProtocolType != ARP_ETHER_PROTO_TYPE)) {\r
@@ -325,7 +338,7 @@ ArpOnFrameRcvd (
   //\r
   // Request ArpOnFrameRcvdDpc as a DPC at TPL_CALLBACK\r
   //\r
-  NetLibQueueDpc (TPL_CALLBACK, ArpOnFrameRcvdDpc, Context);\r
+  QueueDpc (TPL_CALLBACK, ArpOnFrameRcvdDpc, Context);\r
 }\r
 \r
 /**\r
@@ -360,10 +373,10 @@ ArpOnFrameSentDpc (
   //\r
   // Free the allocated memory and close the event.\r
   //\r
-  gBS->FreePool (TxData->FragmentTable[0].FragmentBuffer);\r
-  gBS->FreePool (TxData);\r
+  FreePool (TxData->FragmentTable[0].FragmentBuffer);\r
+  FreePool (TxData);\r
   gBS->CloseEvent (TxToken->Event);\r
-  gBS->FreePool (TxToken);\r
+  FreePool (TxToken);\r
 }\r
 \r
 /**\r
@@ -386,7 +399,7 @@ ArpOnFrameSent (
   //\r
   // Request ArpOnFrameSentDpc as a DPC at TPL_CALLBACK\r
   //\r
-  NetLibQueueDpc (TPL_CALLBACK, ArpOnFrameSentDpc, Context);\r
+  QueueDpc (TPL_CALLBACK, ArpOnFrameSentDpc, Context);\r
 }\r
 \r
 \r
@@ -437,7 +450,7 @@ ArpTimerHandler (
         ASSERT (IsListEmpty (&CacheEntry->UserRequestList));\r
 \r
         RemoveEntryList (&CacheEntry->List);\r
-        gBS->FreePool (CacheEntry);\r
+        FreePool (CacheEntry);\r
       } else {\r
         //\r
         // resend the ARP request.\r
@@ -479,7 +492,7 @@ ArpTimerHandler (
       // Time out, remove it.\r
       //\r
       RemoveEntryList (&CacheEntry->List);\r
-      gBS->FreePool (CacheEntry);\r
+      FreePool (CacheEntry);\r
     } else {\r
       //\r
       // Update the DecayTime.\r
@@ -507,7 +520,7 @@ ArpTimerHandler (
       // Time out, remove it.\r
       //\r
       RemoveEntryList (&CacheEntry->List);\r
-      gBS->FreePool (CacheEntry);\r
+      FreePool (CacheEntry);\r
     } else {\r
       //\r
       // Update the DecayTime.\r
@@ -533,6 +546,8 @@ ArpMatchAddress (
   IN NET_ARP_ADDRESS  *AddressTwo\r
   )\r
 {\r
+  ASSERT (AddressOne != NULL && AddressTwo != NULL);\r
+\r
   if ((AddressOne->Type != AddressTwo->Type) ||\r
     (AddressOne->Length != AddressTwo->Length)) {\r
     //\r
@@ -803,7 +818,7 @@ ArpAddressResolved (
       // Remove this user request and free the context data.\r
       //\r
       RemoveEntryList (&Context->List);\r
-      gBS->FreePool (Context);\r
+      FreePool (Context);\r
 \r
       Count++;\r
     }\r
@@ -812,7 +827,7 @@ ArpAddressResolved (
   //\r
   // Dispatch the DPCs queued by the NotifyFunction of the Context->UserRequestEvent.\r
   //\r
-  NetLibDispatchDpc ();\r
+  DispatchDpc ();\r
 \r
   return Count;\r
 }\r
@@ -928,9 +943,9 @@ ArpConfigureInstance (
       if (ConfigData->SwAddressType == IPV4_ETHER_PROTO_TYPE) {\r
         CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR));\r
 \r
-        if (!Ip4IsUnicast (NTOHL (Ip), 0)) {\r
+        if (IP4_IS_UNSPECIFIED (Ip) || IP4_IS_LOCAL_BROADCAST (Ip)) {\r
           //\r
-          // The station address is not a valid IPv4 unicast address.\r
+          // The station address should not be zero or broadcast address.\r
           //\r
           return EFI_INVALID_PARAMETER;\r
         }\r
@@ -988,7 +1003,7 @@ ArpConfigureInstance (
       //\r
       // Free the buffer previously allocated to hold the station address.\r
       //\r
-      gBS->FreePool (OldConfigData->StationAddress);\r
+      FreePool (OldConfigData->StationAddress);\r
     }\r
 \r
     Instance->Configured = FALSE;\r
@@ -1189,18 +1204,18 @@ ArpSendFrame (
 CLEAN_EXIT:\r
 \r
   if (Packet != NULL) {\r
-    gBS->FreePool (Packet);\r
+    FreePool (Packet);\r
   }\r
 \r
   if (TxData != NULL) {\r
-    gBS->FreePool (TxData);\r
+    FreePool (TxData);\r
   }\r
 \r
   if (TxToken->Event != NULL) {\r
     gBS->CloseEvent (TxToken->Event);\r
   }\r
 \r
-  gBS->FreePool (TxToken);\r
+  FreePool (TxToken);\r
 }\r
 \r
 \r
@@ -1286,7 +1301,7 @@ MATCHED:
     //\r
     RemoveEntryList (&CacheEntry->List);\r
     ASSERT (IsListEmpty (&CacheEntry->UserRequestList));\r
-    gBS->FreePool (CacheEntry);\r
+    FreePool (CacheEntry);\r
 \r
     Count++;\r
   }\r
@@ -1399,7 +1414,7 @@ ArpCancelRequest (
         // No user requests any more, remove this request cache entry.\r
         //\r
         RemoveEntryList (&CacheEntry->List);\r
-        gBS->FreePool (CacheEntry);\r
+        FreePool (CacheEntry);\r
       }\r
     }\r
   }\r