]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Fix IPv4 stack potential disappeared issue
authorJiaxin Wu <jiaxin.wu@intel.com>
Thu, 30 Jun 2016 07:53:01 +0000 (15:53 +0800)
committerJiaxin Wu <jiaxin.wu@intel.com>
Thu, 7 Jul 2016 00:46:48 +0000 (08:46 +0800)
IP4_CONFIG2_INSTANCE->DataItem is used to save the configuration
data to NV variable. When the policy is changed from static to
DHCP, DnsServers info will be cleaned from DataItem first
(See Ip4Config2SetPolicy), it's correct because DnsServers info
should not be saved to NV variable.
But if there is any DnsServers info received from DHCP message, it
will be reset to DataItem again (See Ip4Config2SetDnsServerWorker),
which may cause the NV variable contain the DnsServers info while
the policy is DHCP (See Ip4Config2WriteConfigData).
Then, while the platform is reset, the issue happened. Because
Ip4Config2DataTypeDnsServer is set under DHCP policy, which is not
allowed by UEFI Spec and error returned.

This patch is used to resolve this potential issue.

Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Cc: Zhang Lubo <lubo.zhang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Zhang Lubo <lubo.zhang@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c

index 028c61de066b9735e75090106ee5aa6a8dfb9a8a..f91a935634415b13a60ddd13a3184e298b3a11eb 100644 (file)
@@ -1060,7 +1060,6 @@ Ip4Config2GetIfInfo (
   IN VOID                 *Data      OPTIONAL\r
   )\r
 {\r
-\r
   IP4_SERVICE                    *IpSb;\r
   UINTN                          Length;\r
   IP4_CONFIG2_DATA_ITEM          *Item;\r
@@ -1179,6 +1178,7 @@ Ip4Config2SetPolicy (
       DataItem->Data.Ptr = NULL;\r
       DataItem->DataSize = 0;\r
       DataItem->Status   = EFI_NOT_FOUND;\r
+      SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_VOLATILE);\r
       NetMapIterate (&DataItem->EventMap, Ip4Config2SignalEvent, NULL);\r
     } else {\r
       //\r
@@ -1459,10 +1459,20 @@ Ip4Config2SetDnsServer (
   IN VOID                 *Data\r
   )\r
 {\r
+  IP4_CONFIG2_DATA_ITEM *Item;\r
+\r
+  Item = NULL;\r
+\r
   if (Instance->Policy != Ip4Config2PolicyStatic) {\r
     return EFI_WRITE_PROTECTED;\r
   }\r
 \r
+  Item = &Instance->DataItem[Ip4Config2DataTypeDnsServer];\r
+\r
+  if (DATA_ATTRIB_SET (Item->Attribute, DATA_ATTRIB_VOLATILE)) {\r
+    REMOVE_DATA_ATTRIB (Item->Attribute, DATA_ATTRIB_VOLATILE);\r
+  }\r
+\r
   return Ip4Config2SetDnsServerWorker (Instance, DataSize, Data);\r
 }\r
 \r
index b2665bd3c15117ea1cd2b8d6ffd5a61c8de9827a..b6da11f8ec9d17982e80a7829b61dfde4da179a5 100644 (file)
@@ -27,6 +27,7 @@
 \r
 #define DATA_ATTRIB_SET(Attrib, Bits)       (BOOLEAN)((Attrib) & (Bits))\r
 #define SET_DATA_ATTRIB(Attrib, Bits)       ((Attrib) |= (Bits))\r
+#define REMOVE_DATA_ATTRIB(Attrib, Bits)    ((Attrib) &= (~Bits))\r
 \r
 typedef struct _IP4_CONFIG2_INSTANCE IP4_CONFIG2_INSTANCE;\r
 \r
index fcd3ccb9fd2c218201dd032dff1a32822e9e6edb..20bc21fec1c135231b634c7d81adf540dec5c1c7 100644 (file)
@@ -598,6 +598,10 @@ Ip4DriverBindingStart (
       if (EFI_ERROR(Status)) {\r
         goto UNINSTALL_PROTOCOL;\r
       }\r
+      \r
+      if (Index == Ip4Config2DataTypePolicy && (*(DataItem->Data.Policy) == Ip4Config2PolicyDhcp)) {\r
+        break;\r
+      } \r
     }\r
   }\r
  \r