From 0196c24a94c65a7d8ccbd111adff06b84d595a55 Mon Sep 17 00:00:00 2001 From: Dandan Bi Date: Fri, 15 Jan 2016 09:50:40 +0000 Subject: [PATCH] MdeModulePkg:Fix the potential memory leak issue in Display Engine The MenuOption insert to gMenuOption allocate memory every time,but not free. Now add the code to free it.And for Date/Time,it will create 3 menus,but previously the Description point to the same address,so when free the Description,it will cause issue,now reset the Description pointer. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Dandan Bi Reviewed-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19647 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/DisplayEngineDxe/FormDisplay.c | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index a391442d16..37cfcc591f 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -1,7 +1,7 @@ /** @file Entry and initialization module for the browser. -Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
Copyright (c) 2014, Hewlett-Packard Development Company, L.P.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -604,7 +604,6 @@ UiAddMenuOption ( UI_MENU_OPTION *MenuOption; UINTN Index; UINTN Count; - CHAR16 *String; UINT16 NumberOfLines; UINT16 GlyphWidth; UINT16 Width; @@ -621,9 +620,6 @@ UiAddMenuOption ( PromptId = GetPrompt (Statement->OpCode); ASSERT (PromptId != 0); - String = GetToken (PromptId, gFormData->HiiHandle); - ASSERT (String != NULL); - if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { Count = 3; } @@ -633,7 +629,7 @@ UiAddMenuOption ( ASSERT (MenuOption); MenuOption->Signature = UI_MENU_OPTION_SIGNATURE; - MenuOption->Description = String; + MenuOption->Description = GetToken (PromptId, gFormData->HiiHandle); MenuOption->Handle = gFormData->HiiHandle; MenuOption->ThisTag = Statement; MenuOption->NestInStatement = NestIn; @@ -697,11 +693,11 @@ UiAddMenuOption ( (Statement->OpCode->OpCode != EFI_IFR_DATE_OP) && (Statement->OpCode->OpCode != EFI_IFR_TIME_OP)) { Width = GetWidth (MenuOption, NULL); - for (; GetLineByWidth (String, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) { + for (; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) { // // If there is more string to process print on the next row and increment the Skip value // - if (StrLen (&String[ArrayEntry]) != 0) { + if (StrLen (&MenuOption->Description[ArrayEntry]) != 0) { NumberOfLines++; } FreePool (OutputString); @@ -3729,6 +3725,35 @@ UiDisplayMenu ( } } +/** + Free the UI Menu Option structure data. + + @param MenuOptionList Point to the menu option list which need to be free. + +**/ + +VOID +FreeMenuOptionData( + LIST_ENTRY *MenuOptionList + ) +{ + LIST_ENTRY *Link; + UI_MENU_OPTION *Option; + + // + // Free menu option list + // + while (!IsListEmpty (MenuOptionList)) { + Link = GetFirstNode (MenuOptionList); + Option = MENU_OPTION_FROM_LINK (Link); + if (Option->Description != NULL){ + FreePool(Option->Description); + } + RemoveEntryList (&Option->Link); + FreePool (Option); + } +} + /** Base on the browser status info to show an pop up message. @@ -4001,6 +4026,11 @@ FormDisplay ( CopyGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid); gOldFormEntry.FormId = FormData->FormId; + // + //Free the Ui menu option list. + // + FreeMenuOptionData(&gMenuOption); + return Status; }