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 | 7 ++++++- NetworkPkg/DnsDxe/ComponentName.c | 11 +++++++++++ NetworkPkg/DnsDxe/DnsDhcp.c | 13 ++++++++++++- NetworkPkg/DnsDxe/DnsImpl.c | 35 ++++++++++++++++++++++++++++++++++ NetworkPkg/HttpBootDxe/HttpBootDhcp6.c | 6 +++++- NetworkPkg/Ip6Dxe/ComponentName.c | 27 ++++++++++++++++++++++++++ NetworkPkg/IpSecDxe/IkeService.c | 27 ++++++++++++++++++++++++++ NetworkPkg/Mtftp6Dxe/Mtftp6Support.c | 26 +++++++++++++++++++++++++ NetworkPkg/TcpDxe/TcpMisc.c | 30 ++++++++++++++++++++++++++++- NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c | 7 ++++++- NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c | 34 +++++++++++++++++++++++++++++++-- 11 files changed, 216 insertions(+), 7 deletions(-) diff --git a/NetworkPkg/Dhcp6Dxe/ComponentName.c b/NetworkPkg/Dhcp6Dxe/ComponentName.c index 927a7fe..e46106d 100644 --- a/NetworkPkg/Dhcp6Dxe/ComponentName.c +++ b/NetworkPkg/Dhcp6Dxe/ComponentName.c @@ -284,11 +284,16 @@ UpdateName ( if (Dhcp6ModeData.Ia->State > Dhcp6Rebinding) { return EFI_DEVICE_ERROR; } HandleName = mDhcp6ControllerName[Dhcp6ModeData.Ia->State]; } - + // + // The caller is responsible for freeing the reference buffer + // + FreePool (Dhcp6ModeData.ClientId); + FreePool (Dhcp6ModeData.Ia); + Status = AddUnicodeString2 ( "eng", gDhcp6ComponentName.SupportedLanguages, &gDhcp6ControllerNameTable, HandleName, diff --git a/NetworkPkg/DnsDxe/ComponentName.c b/NetworkPkg/DnsDxe/ComponentName.c index d95ed92..1efd425 100644 --- a/NetworkPkg/DnsDxe/ComponentName.c +++ b/NetworkPkg/DnsDxe/ComponentName.c @@ -209,10 +209,16 @@ UpdateDns4Name ( ModeData.DnsConfigData.StationIp.Addr[2], ModeData.DnsConfigData.StationIp.Addr[3], ModeData.DnsConfigData.LocalPort ); + // + // The caller is responsible for freeing the reference buffer + // + FreePool (ModeData.DnsCacheList); + FreePool (ModeData.DnsServerList); + if (gDnsControllerNameTable != NULL) { FreeUnicodeStringTable (gDnsControllerNameTable); gDnsControllerNameTable = NULL; } @@ -278,10 +284,15 @@ UpdateDns6Name ( sizeof (HandleName), L"DNSv6 (StationIp=%s, LocalPort=%d)", Address, ModeData.DnsConfigData.LocalPort ); + // + // The caller is responsible for freeing the reference buffer + // + FreePool (ModeData.DnsServerList); + FreePool (ModeData.DnsCacheList); if (gDnsControllerNameTable != NULL) { FreeUnicodeStringTable (gDnsControllerNameTable); gDnsControllerNameTable = NULL; } diff --git a/NetworkPkg/DnsDxe/DnsDhcp.c b/NetworkPkg/DnsDxe/DnsDhcp.c index 6b409ba..71fb698 100644 --- a/NetworkPkg/DnsDxe/DnsDhcp.c +++ b/NetworkPkg/DnsDxe/DnsDhcp.c @@ -131,11 +131,22 @@ DnsStartIp4( while (!Timeout) { Ip4->Poll (Ip4); if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) && - Ip4Mode.IsConfigured) { + Ip4Mode.IsConfigured) { + if (Ip4Mode.GroupTable != NULL) { + FreePool (Ip4Mode.GroupTable); + } + + if (Ip4Mode.RouteTable != NULL) { + FreePool (Ip4Mode.RouteTable); + } + + if (Ip4Mode.IcmpTypeList != NULL) { + FreePool (Ip4Mode.IcmpTypeList); + } break; } } if (Timeout) { diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c index 71dacce..e5cbfc6 100644 --- a/NetworkPkg/DnsDxe/DnsImpl.c +++ b/NetworkPkg/DnsDxe/DnsImpl.c @@ -568,10 +568,21 @@ Dns4GetMapping ( while (!EFI_ERROR (gBS->CheckEvent (Service->TimerToGetMap))) { Udp->Poll (Udp); if (!EFI_ERROR (Udp->GetModeData (Udp, NULL, &Ip4Mode, NULL, NULL)) && Ip4Mode.IsConfigured) { + if (Ip4Mode.GroupTable != NULL) { + FreePool (Ip4Mode.GroupTable); + } + + if (Ip4Mode.RouteTable != NULL) { + FreePool (Ip4Mode.RouteTable); + } + + if (Ip4Mode.IcmpTypeList != NULL) { + FreePool (Ip4Mode.IcmpTypeList); + } Udp->Configure (Udp, NULL); return (BOOLEAN) (Udp->Configure (Udp, UdpCfgData) == EFI_SUCCESS); } } @@ -619,10 +630,34 @@ Dns6GetMapping ( Udp->Poll (Udp); if (!EFI_ERROR (Udp->GetModeData (Udp, NULL, &Ip6Mode, NULL, NULL)) && Ip6Mode.IsConfigured) { + 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); + } + Udp->Configure (Udp, NULL); return (BOOLEAN) (Udp->Configure (Udp, UdpCfgData) == EFI_SUCCESS); } } diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c index e5cf894..3067f2d 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c +++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c @@ -972,12 +972,16 @@ 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); + // + // The caller is responsible for freeing the reference buffer + // + FreePool (Mode.ClientId); + FreePool (Mode.Ia); } return Status; } diff --git a/NetworkPkg/Ip6Dxe/ComponentName.c b/NetworkPkg/Ip6Dxe/ComponentName.c index 75a1562..103d081 100644 --- a/NetworkPkg/Ip6Dxe/ComponentName.c +++ b/NetworkPkg/Ip6Dxe/ComponentName.c @@ -262,10 +262,37 @@ UpdateName ( // Format the child name into the string buffer. // Offset = 0; Status = Ip6->GetModeData (Ip6, &Ip6ModeData, NULL, NULL); if (!EFI_ERROR (Status) && Ip6ModeData.IsStarted) { + // + // The caller need to free the reference buffer + // + 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); + } + Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.StationAddress, Address, sizeof(Address)); if (EFI_ERROR (Status)) { return Status; } Offset += UnicodeSPrint ( diff --git a/NetworkPkg/IpSecDxe/IkeService.c b/NetworkPkg/IpSecDxe/IkeService.c index d857196..2803a89 100644 --- a/NetworkPkg/IpSecDxe/IkeService.c +++ b/NetworkPkg/IpSecDxe/IkeService.c @@ -345,10 +345,37 @@ IkeOpenOutputUdp ( } UdpService->IsConfigured = TRUE; ON_EXIT: + // + // The caller need to free the reference buffer + // + 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 (IfInfo != NULL) { FreePool (IfInfo); } return Status; diff --git a/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c b/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c index c31fc9d..9487d30 100644 --- a/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c +++ b/NetworkPkg/Mtftp6Dxe/Mtftp6Support.c @@ -330,10 +330,36 @@ Mtftp6GetMapping ( } } } ON_EXIT: + // + // The caller need to free the reference buffer + // + 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 (Event != NULL) { gBS->CloseEvent (Event); } diff --git a/NetworkPkg/TcpDxe/TcpMisc.c b/NetworkPkg/TcpDxe/TcpMisc.c index 4096252..a8fdc78 100644 --- a/NetworkPkg/TcpDxe/TcpMisc.c +++ b/NetworkPkg/TcpDxe/TcpMisc.c @@ -559,17 +559,45 @@ TcpGetRcvMss ( if (Sock->IpVersion == IP_VERSION_4) { Ip4 = TcpProto->TcpService->IpIo->Ip.Ip4; ASSERT (Ip4 != NULL); Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL); + if (Ip4Mode.GroupTable != NULL) { + FreePool (Ip4Mode.GroupTable); + } + + if (Ip4Mode.RouteTable != NULL) { + FreePool (Ip4Mode.RouteTable); + } + + if (Ip4Mode.IcmpTypeList != NULL) { + FreePool (Ip4Mode.IcmpTypeList); + } return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD)); } else { Ip6 = TcpProto->TcpService->IpIo->Ip.Ip6; ASSERT (Ip6 != NULL); 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..fe15950 100644 --- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c +++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c @@ -2080,17 +2080,22 @@ 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)); + // + // The caller is responsible for freeing the reference buffer + // + FreePool (Mode.ClientId); + FreePool (Mode.Ia); // // Check the selected offer whether BINL retry is needed. // Status = PxeBcHandleDhcp6Offer (Private); if (EFI_ERROR (Status)) { Dhcp6->Stop (Dhcp6); return Status; } - + return EFI_SUCCESS; } diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c index a6f6668..e125768 100644 --- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c +++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c @@ -729,10 +729,22 @@ PxeBcCreateIp4Children ( // Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL); if (EFI_ERROR (Status)) { goto ON_ERROR; } + + if (Ip4ModeData.GroupTable != NULL) { + FreePool (Ip4ModeData.GroupTable); + } + + if (Ip4ModeData.RouteTable != NULL) { + FreePool (Ip4ModeData.RouteTable); + } + + if (Ip4ModeData.IcmpTypeList != NULL) { + FreePool (Ip4ModeData.IcmpTypeList); + } Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize; Private->Ip4Nic = AllocateZeroPool (sizeof (PXEBC_VIRTUAL_NIC)); if (Private->Ip4Nic == NULL) { @@ -1056,13 +1068,31 @@ PxeBcCreateIp6Children ( // Status = Private->Ip6->GetModeData (Private->Ip6, &Ip6ModeData, NULL, NULL); if (EFI_ERROR (Status)) { 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