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