From 475387e9de0bed70b57165d0a389f3aee97d4058 Mon Sep 17 00:00:00 2001 From: Jaben Carsey Date: Thu, 2 Oct 2014 16:41:28 +0000 Subject: [PATCH] ShellPkg: Update SetVar to use existing attributes for updating existing variables. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jaben Carsey Reviewed-by: Erik Bjorge Reviewed-by: Tapan Shah git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16194 6f19259b-4bc3-4df7-8a09-765794883524 --- .../UefiShellDebug1CommandsLib/SetVar.c | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c index 9e57998ff8..0749826b89 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c @@ -1,7 +1,7 @@ /** @file Main file for SetVar shell Debug1 function. - Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.
+ Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials 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 @@ -44,7 +44,6 @@ ShellCommandRunSetVar ( EFI_GUID Guid; CONST CHAR16 *StringGuid; UINT32 Attributes; - UINT32 Attributes2; VOID *Buffer; UINTN Size; UINTN LoopVar; @@ -98,7 +97,7 @@ ShellCommandRunSetVar ( ShellStatus = SHELL_INVALID_PARAMETER; } } - if (Data == NULL) { + if (Data == NULL || Data[0] != L'=') { // // Display what's there // @@ -129,22 +128,43 @@ ShellCommandRunSetVar ( ASSERT(ShellStatus == SHELL_SUCCESS); } } else { - if (Data[0] == L'=') { - Data++; - } // - // Change what's there + // Change what's there or create a new one. // - if (ShellCommandLineGetFlag(Package, L"-bs")) { - Attributes |= EFI_VARIABLE_BOOTSERVICE_ACCESS; - } - if (ShellCommandLineGetFlag(Package, L"-rt")) { - Attributes |= EFI_VARIABLE_RUNTIME_ACCESS | - EFI_VARIABLE_BOOTSERVICE_ACCESS; + + ASSERT(Data[0] == L'='); + Data++; + + // + // Determine if the variable exists and get the attributes + // + Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); + if (Status == EFI_BUFFER_TOO_SMALL) { + Buffer = AllocateZeroPool(Size); + Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); } - if (ShellCommandLineGetFlag(Package, L"-nv")) { - Attributes |= EFI_VARIABLE_NON_VOLATILE; + + if (EFI_ERROR(Status) || Buffer == NULL) { + // + // Creating a new variable. determine attributes from command line. + // + Attributes = 0; + if (ShellCommandLineGetFlag(Package, L"-bs")) { + Attributes |= EFI_VARIABLE_BOOTSERVICE_ACCESS; + } + if (ShellCommandLineGetFlag(Package, L"-rt")) { + Attributes |= EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_BOOTSERVICE_ACCESS; + } + if (ShellCommandLineGetFlag(Package, L"-nv")) { + Attributes |= EFI_VARIABLE_NON_VOLATILE; + } } + SHELL_FREE_NON_NULL(Buffer); + + // + // What type is the new data. + // if (ShellIsHexOrDecimalNumber(Data, TRUE, FALSE)) { if (StrLen(Data) % 2 != 0) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, Data); @@ -171,17 +191,6 @@ ShellCommandRunSetVar ( } } } else if (StrnCmp(Data, L"\"", 1) == 0) { - Size = 0; - Attributes2 = 0; - Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes2, &Size, Buffer); - if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocateZeroPool(Size); - Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes2, &Size, Buffer); - if (Buffer != NULL) { - FreePool(Buffer); - } - Attributes = Attributes2; - } // // ascii text // -- 2.39.2