From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=fan.wang@intel.com; receiver=edk2-devel@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 3E3B821A1097D for ; Sun, 26 Nov 2017 22:40:13 -0800 (PST) Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Nov 2017 22:44:34 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,463,1505804400"; d="scan'208";a="178122795" Received: from fanwang2-hp.ccr.corp.intel.com ([10.239.9.117]) by orsmga005.jf.intel.com with ESMTP; 26 Nov 2017 22:44:32 -0800 From: fanwang2 To: edk2-devel@lists.01.org Cc: Jiaxin Wu , Ye Ting , Fu Siyuan , Wang Fan Date: Mon, 27 Nov 2017 14:43:50 +0800 Message-Id: <1511765030-9008-1-git-send-email-fan.wang@intel.com> X-Mailer: git-send-email 1.9.5.msysgit.1 Subject: [Patch v2] MdeModulePkg: Free NET_BUF data after it is sent out to avoid memory leak X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Nov 2017 06:40:13 -0000 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 Cc: Ye Ting Cc: Fu Siyuan Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wang Fan --- MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h | 12 ++++++++++++ MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c | 13 +++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h index e546a08..57f6d5e 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h @@ -182,10 +182,22 @@ VOID DhcpCleanConfigure ( 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 elapsed time option. @param[in] Elapsed The pointer to the position to append. @param[in] Instance The pointer to the Dhcp4 instance. diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c index 3898223..54a610a 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c @@ -1357,17 +1357,16 @@ DhcpSendMessage ( &DhcpSb->ClientAddressSendOut[0], &Packet->Dhcp4.Header.ClientHwAddr[0], Packet->Dhcp4.Header.HwAddrLen ); - // // Wrap it into a netbuf then send it. // Frag.Bulk = (UINT8 *) &Packet->Dhcp4.Header; Frag.Len = Packet->Length; - Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, Packet); + Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL); if (Wrap == NULL) { FreePool (Packet); return EFI_OUT_OF_RESOURCES; } @@ -1397,11 +1396,10 @@ DhcpSendMessage ( EndPoint.LocalAddr.Addr[0] = DhcpSb->ClientAddr; UdpIo = DhcpSb->LeaseIoPort; } ASSERT (UdpIo != NULL); - NET_GET_REF (Wrap); Status = UdpIoSendDatagram ( UdpIo, Wrap, &EndPoint, @@ -1409,11 +1407,11 @@ DhcpSendMessage ( DhcpOnPacketSent, DhcpSb ); if (EFI_ERROR (Status)) { - NET_PUT_REF (Wrap); + NetbufFree (Wrap); return EFI_ACCESS_DENIED; } return EFI_SUCCESS; } @@ -1452,16 +1450,16 @@ DhcpRetransmit ( // // Wrap it into a netbuf then send it. // Frag.Bulk = (UINT8 *) &DhcpSb->LastPacket->Dhcp4.Header; 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) { return EFI_OUT_OF_RESOURCES; } - + // // Broadcast the message, unless we know the server address. // EndPoint.RemotePort = DHCP_SERVER_PORT; EndPoint.LocalPort = DHCP_CLIENT_PORT; @@ -1475,22 +1473,21 @@ DhcpRetransmit ( UdpIo = DhcpSb->LeaseIoPort; } ASSERT (UdpIo != NULL); - NET_GET_REF (Wrap); Status = UdpIoSendDatagram ( UdpIo, Wrap, &EndPoint, NULL, DhcpOnPacketSent, DhcpSb ); if (EFI_ERROR (Status)) { - NET_PUT_REF (Wrap); + NetbufFree (Wrap); return EFI_ACCESS_DENIED; } return EFI_SUCCESS; } -- 1.9.5.msysgit.1