v3:
* Change the code logic in Ip6Dxe/ComponentName.c and TcpMisc.c

Multiple network protocols have a GetModeData() interface, which may allocate 
memory resource in the return mode
data structure. It's callers responsibility to free these buffers.

Cc: Fu Siyuan <siyuan...@intel.com>
Cc: Ye Ting <ting...@intel.com>
Cc: Wu Jiaxin <jiaxin...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <lubo.zh...@intel.com>
---
 NetworkPkg/Dhcp6Dxe/ComponentName.c    |  9 ++++++++-
 NetworkPkg/DnsDxe/ComponentName.c      | 14 ++++++++++++++
 NetworkPkg/DnsDxe/DnsImpl.c            | 32 ++++++++++++++++++++++++++++----
 NetworkPkg/HttpBootDxe/HttpBootDhcp6.c |  7 ++++++-
 NetworkPkg/Ip6Dxe/ComponentName.c      | 26 ++++++++++++++++++++++++++
 NetworkPkg/IpSecDxe/IkeService.c       | 25 +++++++++++++++++++++++++
 NetworkPkg/Mtftp6Dxe/Mtftp6Support.c   | 23 +++++++++++++++++++++++
 NetworkPkg/TcpDxe/TcpMisc.c            | 26 +++++++++++++++++++++++++-
 NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c   |  7 ++++++-
 NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c  | 24 ++++++++++++++++++++++++
 10 files changed, 185 insertions(+), 8 deletions(-)

diff --git a/NetworkPkg/Dhcp6Dxe/ComponentName.c 
b/NetworkPkg/Dhcp6Dxe/ComponentName.c
index 927a7fe..c34681d 100644
--- a/NetworkPkg/Dhcp6Dxe/ComponentName.c
+++ b/NetworkPkg/Dhcp6Dxe/ComponentName.c
@@ -284,11 +284,18 @@ UpdateName (
     if (Dhcp6ModeData.Ia->State > Dhcp6Rebinding) {
       return EFI_DEVICE_ERROR;
     }
     HandleName = mDhcp6ControllerName[Dhcp6ModeData.Ia->State];
   }
-  
+
+  if (Dhcp6ModeData.Ia != NULL) {
+    FreePool (Dhcp6ModeData.Ia);
+  }
+  if (Dhcp6ModeData.ClientId != NULL) {
+    FreePool (Dhcp6ModeData.ClientId);
+  }
+
   Status = AddUnicodeString2 (
              "eng",
              gDhcp6ComponentName.SupportedLanguages,
              &gDhcp6ControllerNameTable,
              HandleName,
diff --git a/NetworkPkg/DnsDxe/ComponentName.c 
b/NetworkPkg/DnsDxe/ComponentName.c
index d95ed92..8dcf280 100644
--- a/NetworkPkg/DnsDxe/ComponentName.c
+++ b/NetworkPkg/DnsDxe/ComponentName.c
@@ -209,10 +209,17 @@ UpdateDns4Name (
     ModeData.DnsConfigData.StationIp.Addr[2],
     ModeData.DnsConfigData.StationIp.Addr[3],
     ModeData.DnsConfigData.LocalPort
     );
 
+  if (ModeData.DnsCacheList != NULL) {
+    FreePool (ModeData.DnsCacheList);
+  }
+  if (ModeData.DnsServerList != NULL) {
+    FreePool (ModeData.DnsServerList);
+  }
+
   if (gDnsControllerNameTable != NULL) {
     FreeUnicodeStringTable (gDnsControllerNameTable);
     gDnsControllerNameTable = NULL;
   }
   
@@ -279,10 +286,17 @@ UpdateDns6Name (
     L"DNSv6 (StationIp=%s, LocalPort=%d)",
     Address,
     ModeData.DnsConfigData.LocalPort
     );
 
+  if (ModeData.DnsCacheList != NULL) {
+    FreePool (ModeData.DnsCacheList);
+  }
+  if (ModeData.DnsServerList != NULL) {
+    FreePool (ModeData.DnsServerList);
+  }
+
   if (gDnsControllerNameTable != NULL) {
     FreeUnicodeStringTable (gDnsControllerNameTable);
     gDnsControllerNameTable = NULL;
   }
   
diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c
index 71dacce..3afd6a5 100644
--- a/NetworkPkg/DnsDxe/DnsImpl.c
+++ b/NetworkPkg/DnsDxe/DnsImpl.c
@@ -616,15 +616,39 @@ Dns6GetMapping (
   }
 
   while (!EFI_ERROR (gBS->CheckEvent (Service->TimerToGetMap))) {
     Udp->Poll (Udp);
 
-    if (!EFI_ERROR (Udp->GetModeData (Udp, NULL, &Ip6Mode, NULL, NULL)) &&
-        Ip6Mode.IsConfigured) {
+    if (!EFI_ERROR (Udp->GetModeData (Udp, NULL, &Ip6Mode, NULL, NULL))) {
+      if (Ip6Mode.AddressList != NULL) {
+        FreePool (Ip6Mode.AddressList);
+      }
 
-      Udp->Configure (Udp, NULL);
-      return (BOOLEAN) (Udp->Configure (Udp, UdpCfgData) == EFI_SUCCESS);
+      if (Ip6Mode.GroupTable != NULL) {
+        FreePool (Ip6Mode.GroupTable);
+      }
+
+      if (Ip6Mode.RouteTable != NULL) {
+        FreePool (Ip6Mode.RouteTable);
+      }
+
+      if (Ip6Mode.NeighborCache != NULL) {
+        FreePool (Ip6Mode.NeighborCache);
+      }
+
+      if (Ip6Mode.PrefixTable != NULL) {
+        FreePool (Ip6Mode.PrefixTable);
+      }
+
+      if (Ip6Mode.IcmpTypeList != NULL) {
+        FreePool (Ip6Mode.IcmpTypeList);
+      }
+
+      if (Ip6Mode.IsConfigured) {
+        Udp->Configure (Udp, NULL);
+        return (BOOLEAN) (Udp->Configure (Udp, UdpCfgData) == EFI_SUCCESS);
+      }
     }
   }
 
   return FALSE;
 }
diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c 
b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c
index e5cf894..01f65f0 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c
+++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c
@@ -972,12 +972,17 @@ ON_EXIT:
   if (EFI_ERROR (Status)) {
     Dhcp6->Stop (Dhcp6);
     Dhcp6->Configure (Dhcp6, NULL);
   } else {
     ZeroMem (&Config, sizeof (EFI_DHCP6_CONFIG_DATA));
-    ZeroMem (&Mode, sizeof (EFI_DHCP6_MODE_DATA));
     Dhcp6->Configure (Dhcp6, &Config);
+    if (Mode.ClientId != NULL) {
+      FreePool (Mode.ClientId);
+    }
+    if (Mode.Ia != NULL) {
+      FreePool (Mode.Ia);
+    }
   }
 
   return Status; 
     
 }
diff --git a/NetworkPkg/Ip6Dxe/ComponentName.c 
b/NetworkPkg/Ip6Dxe/ComponentName.c
index 75a1562..4a3e2c4 100644
--- a/NetworkPkg/Ip6Dxe/ComponentName.c
+++ b/NetworkPkg/Ip6Dxe/ComponentName.c
@@ -261,10 +261,36 @@ UpdateName (
   //
   // Format the child name into the string buffer.
   //
   Offset = 0;
   Status = Ip6->GetModeData (Ip6, &Ip6ModeData, NULL, NULL);
+  if (!EFI_ERROR (Status)) {
+    if (Ip6ModeData.AddressList != NULL) {
+      FreePool (Ip6ModeData.AddressList);
+    }
+
+    if (Ip6ModeData.GroupTable != NULL) {
+      FreePool (Ip6ModeData.GroupTable);
+    }
+
+    if (Ip6ModeData.RouteTable != NULL) {
+      FreePool (Ip6ModeData.RouteTable);
+    }
+
+    if (Ip6ModeData.NeighborCache != NULL) {
+      FreePool (Ip6ModeData.NeighborCache);
+    }
+
+    if (Ip6ModeData.PrefixTable != NULL) {
+      FreePool (Ip6ModeData.PrefixTable);
+    }
+
+    if (Ip6ModeData.IcmpTypeList != NULL) {
+      FreePool (Ip6ModeData.IcmpTypeList);
+    }
+  }
+
   if (!EFI_ERROR (Status) && Ip6ModeData.IsStarted) {
     Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.StationAddress, Address, 
sizeof(Address));
     if (EFI_ERROR (Status)) {
       return Status;
     }
diff --git a/NetworkPkg/IpSecDxe/IkeService.c b/NetworkPkg/IpSecDxe/IkeService.c
index d857196..fa5fd85 100644
--- a/NetworkPkg/IpSecDxe/IkeService.c
+++ b/NetworkPkg/IpSecDxe/IkeService.c
@@ -326,10 +326,35 @@ IkeOpenOutputUdp (
 
     if (EFI_ERROR (Status)) {
       UdpIoFreeIo (UdpService->Output);
       goto ON_EXIT;
     }
+
+    if (Ip6ModeData.AddressList != NULL) {
+      FreePool (Ip6ModeData.AddressList);
+    }
+
+    if (Ip6ModeData.GroupTable != NULL) {
+      FreePool (Ip6ModeData.GroupTable);
+    }
+
+    if (Ip6ModeData.RouteTable != NULL) {
+      FreePool (Ip6ModeData.RouteTable);
+    }
+
+    if (Ip6ModeData.NeighborCache != NULL) {
+      FreePool (Ip6ModeData.NeighborCache);
+    }
+
+    if (Ip6ModeData.PrefixTable != NULL) {
+      FreePool (Ip6ModeData.PrefixTable);
+    }
+
+    if (Ip6ModeData.IcmpTypeList != NULL) {
+      FreePool (Ip6ModeData.IcmpTypeList);
+    }
+
     //
     // Reconfigure udp6 io without remote address.
     //
     Udp6->Configure (Udp6, NULL);
     Status = IkeConfigUdp6 (UdpService->Output, NULL);
diff --git a/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c 
b/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c
index c31fc9d..31b1d78 100644
--- a/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c
+++ b/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c
@@ -317,10 +317,33 @@ Mtftp6GetMapping (
     Udp6->Poll (Udp6);
 
     Status = Udp6->GetModeData (Udp6, NULL, &Ip6Mode, NULL, NULL);
 
     if (!EFI_ERROR (Status)) {
+      if (Ip6Mode.AddressList != NULL) {
+        FreePool (Ip6Mode.AddressList);
+      }
+
+      if (Ip6Mode.GroupTable != NULL) {
+        FreePool (Ip6Mode.GroupTable);
+      }
+
+      if (Ip6Mode.RouteTable != NULL) {
+        FreePool (Ip6Mode.RouteTable);
+      }
+
+      if (Ip6Mode.NeighborCache != NULL) {
+        FreePool (Ip6Mode.NeighborCache);
+      }
+
+      if (Ip6Mode.PrefixTable != NULL) {
+        FreePool (Ip6Mode.PrefixTable);
+      }
+
+      if (Ip6Mode.IcmpTypeList != NULL) {
+        FreePool (Ip6Mode.IcmpTypeList);
+      }
 
       if  (Ip6Mode.IsConfigured) {
         //
         // Continue to configure the Udp6 instance.
         //
diff --git a/NetworkPkg/TcpDxe/TcpMisc.c b/NetworkPkg/TcpDxe/TcpMisc.c
index 4096252..888641d 100644
--- a/NetworkPkg/TcpDxe/TcpMisc.c
+++ b/NetworkPkg/TcpDxe/TcpMisc.c
@@ -564,11 +564,35 @@ TcpGetRcvMss (
 
     return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD));
   } else {
     Ip6 = TcpProto->TcpService->IpIo->Ip.Ip6;
     ASSERT (Ip6 != NULL);
-    Ip6->GetModeData (Ip6, &Ip6Mode, NULL, NULL);
+    if (!EFI_ERROR (Ip6->GetModeData (Ip6, &Ip6Mode, NULL, NULL))) {
+      if (Ip6Mode.AddressList != NULL) {
+        FreePool (Ip6Mode.AddressList);
+      }
+
+      if (Ip6Mode.GroupTable != NULL) {
+        FreePool (Ip6Mode.GroupTable);
+      }
+
+      if (Ip6Mode.RouteTable != NULL) {
+        FreePool (Ip6Mode.RouteTable);
+      }
+
+      if (Ip6Mode.NeighborCache != NULL) {
+        FreePool (Ip6Mode.NeighborCache);
+      }
+
+      if (Ip6Mode.PrefixTable != NULL) {
+        FreePool (Ip6Mode.PrefixTable);
+      }
+
+      if (Ip6Mode.IcmpTypeList != NULL) {
+        FreePool (Ip6Mode.IcmpTypeList);
+      }
+    }
 
     return (UINT16) (Ip6Mode.MaxPacketSize - sizeof (TCP_HEAD));
   }
 }
 
diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c 
b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c
index 6ad5f5f..4b2e7d6 100644
--- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c
+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c
@@ -2080,11 +2080,16 @@ PxeBcDhcp6Sarr (
   // the IP policy is Automatic). So we just hold the station IP address here 
and leave the IP policy as
   // Automatic, until we get the server IP address. This could let IP6 driver 
finish the router discovery 
   // to find a valid router address.
   //
   CopyMem (&Private->TmpStationIp.v6, &Mode.Ia->IaAddress[0].IpAddress, sizeof 
(EFI_IPv6_ADDRESS));
-
+  if (Mode.ClientId != NULL) {
+    FreePool (Mode.ClientId);
+  }
+  if (Mode.Ia != NULL) {
+    FreePool (Mode.Ia);
+  }
   //
   // Check the selected offer whether BINL retry is needed.
   //
   Status = PxeBcHandleDhcp6Offer (Private);
   if (EFI_ERROR (Status)) {
diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c 
b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
index a6f6668..2cccdf0 100644
--- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
@@ -1059,10 +1059,34 @@ PxeBcCreateIp6Children (
     goto ON_ERROR;
   }
 
   Private->Ip6MaxPacketSize = Ip6ModeData.MaxPacketSize;
 
+  if (Ip6ModeData.AddressList != NULL) {
+    FreePool (Ip6ModeData.AddressList);
+  }
+
+  if (Ip6ModeData.GroupTable != NULL) {
+    FreePool (Ip6ModeData.GroupTable);
+  }
+
+  if (Ip6ModeData.RouteTable != NULL) {
+    FreePool (Ip6ModeData.RouteTable);
+  }
+
+  if (Ip6ModeData.NeighborCache != NULL) {
+    FreePool (Ip6ModeData.NeighborCache);
+  }
+
+  if (Ip6ModeData.PrefixTable != NULL) {
+    FreePool (Ip6ModeData.PrefixTable);
+  }
+
+  if (Ip6ModeData.IcmpTypeList != NULL) {
+    FreePool (Ip6ModeData.IcmpTypeList);
+  }
+
   //
   // Locate Ip6->Ip6Config and store it for set IPv6 address.
   //
   Status = gBS->HandleProtocol (
                   ControllerHandle,
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to