mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
MdeModulePkg/Dhcp4Dxe: Free NET_BUF data after sent out to avoid memory leak
* When build a DHCP message in function DhcpSendMessage() or DhcpRetransmit(), a new NET_BUF is created by the library of NetbufFromExt, but it's not freed after it is sent out. This patch is to fix this memory leak issue. V2: * Since packet has already been referred by DhcpSb->LastPacket, and will be freed when sending another packet or clean up, there is no need to add an extra free function in NetbufFromExt. Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Ye Ting <ting.ye@intel.com> Cc: Fu Siyuan <siyuan.fu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wang Fan <fan.wang@intel.com> Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
This commit is contained in:
parent
427b2f41a6
commit
479a3b6053
@ -6,7 +6,7 @@
|
|||||||
RFC 1534: Interoperation Between DHCP and BOOTP
|
RFC 1534: Interoperation Between DHCP and BOOTP
|
||||||
RFC 3396: Encoding Long Options in DHCP.
|
RFC 3396: Encoding Long Options in DHCP.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -184,6 +184,18 @@ DhcpCleanConfigure (
|
|||||||
IN OUT EFI_DHCP4_CONFIG_DATA *Config
|
IN OUT EFI_DHCP4_CONFIG_DATA *Config
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Callback of Dhcp packet. Does nothing.
|
||||||
|
|
||||||
|
@param Arg The context.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
DhcpDummyExtFree (
|
||||||
|
IN VOID *Arg
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set the elapsed time based on the given instance and the pointer to the
|
Set the elapsed time based on the given instance and the pointer to the
|
||||||
elapsed time option.
|
elapsed time option.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
EFI DHCP protocol implementation.
|
EFI DHCP protocol implementation.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -1096,23 +1096,6 @@ RESTART:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Release the packet.
|
|
||||||
|
|
||||||
@param[in] Arg The packet to release
|
|
||||||
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
DhcpReleasePacket (
|
|
||||||
IN VOID *Arg
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FreePool (Arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Release the net buffer when packet is sent.
|
Release the net buffer when packet is sent.
|
||||||
|
|
||||||
@ -1359,13 +1342,12 @@ DhcpSendMessage (
|
|||||||
Packet->Dhcp4.Header.HwAddrLen
|
Packet->Dhcp4.Header.HwAddrLen
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Wrap it into a netbuf then send it.
|
// Wrap it into a netbuf then send it.
|
||||||
//
|
//
|
||||||
Frag.Bulk = (UINT8 *) &Packet->Dhcp4.Header;
|
Frag.Bulk = (UINT8 *) &Packet->Dhcp4.Header;
|
||||||
Frag.Len = Packet->Length;
|
Frag.Len = Packet->Length;
|
||||||
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, Packet);
|
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);
|
||||||
|
|
||||||
if (Wrap == NULL) {
|
if (Wrap == NULL) {
|
||||||
FreePool (Packet);
|
FreePool (Packet);
|
||||||
@ -1399,7 +1381,6 @@ DhcpSendMessage (
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (UdpIo != NULL);
|
ASSERT (UdpIo != NULL);
|
||||||
NET_GET_REF (Wrap);
|
|
||||||
|
|
||||||
Status = UdpIoSendDatagram (
|
Status = UdpIoSendDatagram (
|
||||||
UdpIo,
|
UdpIo,
|
||||||
@ -1411,7 +1392,7 @@ DhcpSendMessage (
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
NET_PUT_REF (Wrap);
|
NetbufFree (Wrap);
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1454,12 +1435,12 @@ DhcpRetransmit (
|
|||||||
//
|
//
|
||||||
Frag.Bulk = (UINT8 *) &DhcpSb->LastPacket->Dhcp4.Header;
|
Frag.Bulk = (UINT8 *) &DhcpSb->LastPacket->Dhcp4.Header;
|
||||||
Frag.Len = DhcpSb->LastPacket->Length;
|
Frag.Len = DhcpSb->LastPacket->Length;
|
||||||
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, DhcpSb->LastPacket);
|
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);
|
||||||
|
|
||||||
if (Wrap == NULL) {
|
if (Wrap == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Broadcast the message, unless we know the server address.
|
// Broadcast the message, unless we know the server address.
|
||||||
//
|
//
|
||||||
@ -1477,7 +1458,6 @@ DhcpRetransmit (
|
|||||||
|
|
||||||
ASSERT (UdpIo != NULL);
|
ASSERT (UdpIo != NULL);
|
||||||
|
|
||||||
NET_GET_REF (Wrap);
|
|
||||||
Status = UdpIoSendDatagram (
|
Status = UdpIoSendDatagram (
|
||||||
UdpIo,
|
UdpIo,
|
||||||
Wrap,
|
Wrap,
|
||||||
@ -1488,7 +1468,7 @@ DhcpRetransmit (
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
NET_PUT_REF (Wrap);
|
NetbufFree (Wrap);
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user