]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c
ShellPkg/SetVar: Fix typo in comments
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SetVar.c
index c59032a81162ea4c523da28ab1fe4763b2760eaa..8fb918d0822d811616eb1333c61640360090d833 100644 (file)
@@ -23,6 +23,21 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
   {NULL, TypeMax}\r
   };\r
 \r
+typedef enum {\r
+  DataTypeHexNumber   = 0,\r
+  DataTypeHexArray    = 1,\r
+  DataTypeAscii       = 2,\r
+  DataTypeUnicode     = 3,\r
+  DataTypeDevicePath  = 4,\r
+  DataTypeUnKnow      = 5\r
+} DATA_TYPE;\r
+\r
+typedef union {\r
+  UINT8     HexNumber8;\r
+  UINT16    HexNumber16;\r
+  UINT32    HexNumber32;\r
+  UINT64    HexNumber64;\r
+} HEX_NUMBER;\r
 \r
 /**\r
   Check if the input is a (potentially empty) string of hexadecimal nibbles.\r
@@ -50,6 +65,271 @@ IsStringOfHexNibbles (
   return TRUE;\r
 }\r
 \r
+/**\r
+  Function to check the TYPE of Data.\r
+\r
+  @param[in]    Data          The Data to be check.\r
+\r
+  @retval       DATA_TYPE     The TYPE of Data.\r
+**/\r
+DATA_TYPE\r
+TestDataType (\r
+  IN CONST CHAR16  *Data\r
+  )\r
+{\r
+  if (Data[0] == L'0' && (Data[1] == L'x' || Data[1] == L'X')) {\r
+    if (IsStringOfHexNibbles (Data+2) && StrLen (Data + 2) <= 16) {\r
+      return DataTypeHexNumber;\r
+    } else {\r
+      return DataTypeUnKnow;\r
+    }\r
+  } else if (Data[0] == L'H') {\r
+    if (IsStringOfHexNibbles (Data + 1) && StrLen (Data + 1) % 2 == 0) {\r
+      return DataTypeHexArray;\r
+    } else {\r
+      return DataTypeUnKnow;\r
+    }\r
+  } else if (Data[0] == L'S') {\r
+    return DataTypeAscii;\r
+  } else if (Data[0] == L'L') {\r
+    return DataTypeUnicode;\r
+  } else if (Data[0] == L'P' || StrnCmp (Data, L"--", 2) == 0) {\r
+    return DataTypeDevicePath;\r
+  }\r
+\r
+  if (IsStringOfHexNibbles (Data) && StrLen (Data) % 2 == 0) {\r
+    return DataTypeHexArray;\r
+  }\r
+\r
+  return DataTypeAscii;\r
+}\r
+\r
+/**\r
+  Function to parse the Data by the type of Data, and save in the Buffer.\r
+\r
+  @param[in]      Data                A pointer to a buffer to be parsed.\r
+  @param[out]     Buffer              A pointer to a buffer to hold the return data.\r
+  @param[in,out]  BufferSize          On input, indicates the size of Buffer in bytes.\r
+                                      On output,indicates the size of data return in Buffer.\r
+                                      Or the size in bytes of the buffer needed to obtain.\r
+\r
+  @retval   EFI_INVALID_PARAMETER     The Buffer or BufferSize is NULL.\r
+  @retval   EFI_BUFFER_TOO_SMALL      The Buffer is too small to hold the data.\r
+  @retval   EFI_OUT_OF_RESOURCES      A memory allcation failed.\r
+  @retval   EFI_SUCCESS               The Data parsed successful and save in the Buffer.\r
+**/\r
+EFI_STATUS\r
+ParseParameterData (\r
+  IN CONST CHAR16   *Data,\r
+  OUT VOID          *Buffer,\r
+  IN OUT UINTN      *BufferSize\r
+  )\r
+{\r
+  UINT64                    HexNumber;\r
+  UINTN                     HexNumberLen;\r
+  UINTN                     Size;\r
+  CHAR8                     *AsciiBuffer;\r
+  DATA_TYPE                 DataType;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevPath;\r
+  EFI_STATUS                Status;\r
+\r
+  HexNumber                 = 0;\r
+  HexNumberLen              = 0;\r
+  Size                      = 0;\r
+  AsciiBuffer               = NULL;\r
+  DevPath                   = NULL;\r
+  Status                    = EFI_SUCCESS;\r
+\r
+  if (Data == NULL || BufferSize == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  DataType = TestDataType (Data);\r
+  if (DataType == DataTypeHexNumber) {\r
+    //\r
+    // hex number\r
+    //\r
+    StrHexToUint64S (Data + 2, NULL, &HexNumber);\r
+    HexNumberLen = StrLen (Data + 2);\r
+    if (HexNumberLen >= 1 && HexNumberLen <= 2) {\r
+      Size = 1;\r
+    } else if (HexNumberLen >= 3 && HexNumberLen <= 4) {\r
+      Size = 2;\r
+    } else if (HexNumberLen >= 5 && HexNumberLen <= 8) {\r
+      Size = 4;\r
+    } else if (HexNumberLen >= 9 && HexNumberLen <= 16) {\r
+      Size = 8;\r
+    }\r
+    if (Buffer != NULL && *BufferSize >= Size) {\r
+      CopyMem(Buffer, (VOID *)&HexNumber, Size);\r
+    } else {\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+    }\r
+    *BufferSize = Size;\r
+  } else if (DataType == DataTypeHexArray) {\r
+    //\r
+    // hex array\r
+    //\r
+    if (*Data == L'H') {\r
+      Data = Data + 1;\r
+    }\r
+\r
+    Size = StrLen (Data) / 2;\r
+    if (Buffer != NULL && *BufferSize >= Size) {\r
+      StrHexToBytes(Data, StrLen  (Data), (UINT8 *)Buffer, Size);\r
+    } else {\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+    }\r
+    *BufferSize = Size;\r
+  } else if (DataType == DataTypeAscii) {\r
+    //\r
+    // ascii text\r
+    //\r
+    if (*Data == L'S') {\r
+      Data = Data + 1;\r
+    }\r
+    AsciiBuffer = AllocateZeroPool (StrSize (Data) / 2);\r
+    if (AsciiBuffer == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+    } else {\r
+      AsciiSPrint (AsciiBuffer, StrSize (Data) / 2, "%s", (CHAR8 *)Data);\r
+\r
+      Size = StrSize (Data) / 2 - 1;\r
+      if (Buffer != NULL && *BufferSize >= Size) {\r
+        CopyMem (Buffer, AsciiBuffer, Size);\r
+      } else {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
+      }\r
+      *BufferSize = Size;\r
+    }\r
+    SHELL_FREE_NON_NULL (AsciiBuffer);\r
+  } else if (DataType == DataTypeUnicode) {\r
+    //\r
+    // unicode text\r
+    //\r
+    if (*Data == L'L') {\r
+      Data = Data + 1;\r
+    }\r
+    Size = StrSize (Data) - sizeof (CHAR16);\r
+    if (Buffer != NULL && *BufferSize >= Size) {\r
+      CopyMem (Buffer, Data, Size);\r
+    } else {\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+    }\r
+    *BufferSize = Size;\r
+  } else if (DataType == DataTypeDevicePath) {\r
+    if (*Data == L'P') {\r
+      Data = Data + 1;\r
+    } else if (StrnCmp (Data, L"--", 2) == 0) {\r
+      Data = Data + 2;\r
+    }\r
+    DevPath = ConvertTextToDevicePath (Data);\r
+    if (DevPath == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar");\r
+      Status = EFI_INVALID_PARAMETER;\r
+    } else {\r
+      Size = GetDevicePathSize (DevPath);\r
+      if (Buffer != NULL && *BufferSize >= Size) {\r
+        CopyMem (Buffer, DevPath, Size);\r
+      } else {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
+      }\r
+      *BufferSize = Size;\r
+    }\r
+    SHELL_FREE_NON_NULL (DevPath);\r
+  } else {\r
+    Status = EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Function to get each data from parameters.\r
+\r
+  @param[in]    Package               The package of checked values.\r
+  @param[out]   Buffer                A pointer to a buffer to hold the return data.\r
+  @param[out]   BufferSize            Indicates the size of data in bytes return in Buffer.\r
+\r
+  @retval   EFI_INVALID_PARAMETER     Buffer or BufferSize is NULL.\r
+  @retval   EFI_OUT_OF_RESOURCES      A memory allcation failed.\r
+  @retval   EFI_SUCCESS               Get each parameter data was successful.\r
+**/\r
+EFI_STATUS\r
+GetVariableDataFromParameter (\r
+  IN CONST LIST_ENTRY *Package,\r
+  OUT UINT8           **Buffer,\r
+  OUT UINTN           *BufferSize\r
+  )\r
+{\r
+  CONST CHAR16    *TempData;\r
+  UINTN           Index;\r
+  UINTN           TotalSize;\r
+  UINTN           Size;\r
+  UINT8           *BufferWalker;\r
+  EFI_STATUS      Status;\r
+\r
+  TotalSize       = 0;\r
+  Size            = 0;\r
+  Status          = EFI_SUCCESS;\r
+\r
+  if (BufferSize == NULL || Buffer == NULL || ShellCommandLineGetCount (Package) < 3) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  for (Index = 2; Index < ShellCommandLineGetCount (Package); Index++) {\r
+    TempData = ShellCommandLineGetRawValue (Package, Index);\r
+    ASSERT (TempData != NULL);\r
+\r
+    if (TempData[0] != L'=') {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", TempData);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
+    TempData = TempData + 1;\r
+    Size = 0;\r
+    Status = ParseParameterData (TempData, NULL, &Size);\r
+    if (EFI_ERROR (Status)) {\r
+      if (Status == EFI_BUFFER_TOO_SMALL) {\r
+        //\r
+        // We expect return EFI_BUFFER_TOO_SMALL when pass 'NULL' as second parameter to the function ParseParameterData.\r
+        //\r
+        TotalSize += Size;\r
+      } else {\r
+        if (Status == EFI_INVALID_PARAMETER) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", TempData);\r
+        } else if (Status == EFI_NOT_FOUND) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar");\r
+        }\r
+        return Status;\r
+      }\r
+    }\r
+  }\r
+\r
+  *BufferSize = TotalSize;\r
+  *Buffer = AllocateZeroPool (TotalSize);\r
+\r
+  if (*Buffer == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+  } else {\r
+    BufferWalker = *Buffer;\r
+    for (Index = 2; Index < ShellCommandLineGetCount (Package); Index++) {\r
+      TempData = ShellCommandLineGetRawValue (Package, Index);\r
+      TempData = TempData + 1;\r
+\r
+      Size = TotalSize;\r
+      Status = ParseParameterData (TempData, (VOID *)BufferWalker, &Size);\r
+      if (!EFI_ERROR (Status)) {\r
+        BufferWalker = BufferWalker + Size;\r
+        TotalSize = TotalSize - Size;\r
+      } else {\r
+        return Status;\r
+      }\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   Function for 'setvar' command.\r
@@ -70,21 +350,18 @@ ShellCommandRunSetVar (
   CHAR16              *ProblemParam;\r
   SHELL_STATUS        ShellStatus;\r
   CONST CHAR16        *VariableName;\r
-  CONST CHAR16        *Data;\r
   EFI_GUID            Guid;\r
   CONST CHAR16        *StringGuid;\r
   UINT32              Attributes;\r
   VOID                *Buffer;\r
   UINTN               Size;\r
   UINTN               LoopVar;\r
-  EFI_DEVICE_PATH_PROTOCOL           *DevPath;\r
 \r
   ShellStatus         = SHELL_SUCCESS;\r
   Status              = EFI_SUCCESS;\r
   Buffer              = NULL;\r
   Size                = 0;\r
   Attributes          = 0;\r
-  DevPath             = NULL;\r
 \r
   //\r
   // initialize the shell lib (we must be in non-auto-init...)\r
@@ -111,12 +388,8 @@ ShellCommandRunSetVar (
     if (ShellCommandLineGetCount(Package) < 2) {\r
       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setvar");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
-    } else if (ShellCommandLineGetCount(Package) > 3) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"setvar");  \r
-      ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       VariableName  = ShellCommandLineGetRawValue(Package, 1);\r
-      Data          = ShellCommandLineGetRawValue(Package, 2);\r
       if (!ShellCommandLineGetFlag(Package, L"-guid")){\r
         CopyGuid(&Guid, &gEfiGlobalVariableGuid);\r
       } else {\r
@@ -127,54 +400,35 @@ ShellCommandRunSetVar (
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         }\r
       }\r
-      if (Data == NULL || Data[0] !=  L'=') {\r
+\r
+      if (ShellCommandLineGetCount(Package) == 2) {\r
         //\r
-        // Display what's there\r
+        // Display\r
         //\r
         Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer);\r
         if (Status == EFI_BUFFER_TOO_SMALL) {\r
           Buffer = AllocateZeroPool(Size);\r
           Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer);\r
         }\r
-        if (!EFI_ERROR(Status)&& Buffer != NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size);\r
-          for (LoopVar = 0 ; LoopVar < Size ; LoopVar++) {\r
+        if (!EFI_ERROR(Status) && Buffer != NULL) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size);\r
+          for (LoopVar = 0; LoopVar < Size; LoopVar++) {\r
             ShellPrintEx(-1, -1, L"%02x ", ((UINT8*)Buffer)[LoopVar]);\r
           }\r
           ShellPrintEx(-1, -1, L"\r\n");\r
         } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
-          ShellStatus = SHELL_ACCESS_DENIED;\r
-        }\r
-      } else if (StrCmp(Data, L"=") == 0) {\r
-        //\r
-        // Delete what's there!\r
-        //\r
-        Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, 0, NULL);\r
-        if (EFI_ERROR(Status)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);\r
           ShellStatus = SHELL_ACCESS_DENIED;\r
-        } else {\r
-          ASSERT(ShellStatus == SHELL_SUCCESS);\r
         }\r
       } else {\r
         //\r
-        // Change what's there or create a new one.\r
-        //\r
-\r
-        ASSERT(Data[0] == L'=');\r
-        Data++;\r
-        ASSERT(Data[0] != L'\0');\r
-\r
-        //\r
-        // Determine if the variable exists and get the attributes\r
+        // Create, Delete or Modify.\r
         //\r
         Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer);\r
         if (Status == EFI_BUFFER_TOO_SMALL) {\r
           Buffer = AllocateZeroPool(Size);\r
           Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer);\r
         }\r
-\r
         if (EFI_ERROR(Status) || Buffer == NULL) {\r
           //\r
           // Creating a new variable.  determine attributes from command line.\r
@@ -193,94 +447,16 @@ ShellCommandRunSetVar (
         }\r
         SHELL_FREE_NON_NULL(Buffer);\r
 \r
-        //\r
-        // What type is the new data.\r
-        //\r
-        if (IsStringOfHexNibbles(Data)) {\r
-          if (StrLen(Data) % 2 != 0) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", Data);  \r
-            ShellStatus = SHELL_INVALID_PARAMETER;\r
-          } else {\r
-            //\r
-            // arbitrary buffer\r
-            //\r
-            Buffer = AllocateZeroPool((StrLen(Data) / 2));\r
-            if (Buffer == NULL) {\r
-              Status = EFI_OUT_OF_RESOURCES;\r
-            } else {\r
-              StrHexToBytes (Data, StrLen (Data), Buffer, StrLen (Data) / 2);\r
-              Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, StrLen(Data) / 2, Buffer);\r
-            }\r
-            if (EFI_ERROR(Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
-              ShellStatus = SHELL_ACCESS_DENIED;\r
-            } else {\r
-              ASSERT(ShellStatus == SHELL_SUCCESS);\r
-            }\r
-          }\r
-        } else if (StrnCmp(Data, L"\"", 1) == 0) {\r
-          //\r
-          // ascii text\r
-          //\r
-          Data++;\r
-          Buffer = AllocateZeroPool(StrSize(Data) / 2);\r
-          if (Buffer == NULL) {\r
-            Status = EFI_OUT_OF_RESOURCES;\r
-          } else {\r
-            AsciiSPrint(Buffer, StrSize(Data) / 2, "%s", Data);\r
-            ((CHAR8*)Buffer)[AsciiStrLen(Buffer)-1] = CHAR_NULL;\r
-            Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, AsciiStrSize(Buffer)-sizeof(CHAR8), Buffer);\r
-          }\r
-          if (EFI_ERROR(Status)) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
-            ShellStatus = SHELL_ACCESS_DENIED;\r
-          } else {\r
-            ASSERT(ShellStatus == SHELL_SUCCESS);\r
-          }\r
-        } else if (StrnCmp(Data, L"L\"", 2) == 0) {\r
-          //\r
-          // ucs2 text\r
-          //\r
-          Data++;\r
-          Data++;\r
-          Buffer = AllocateZeroPool(StrSize(Data));\r
-          if (Buffer == NULL) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"setvar");  \r
-            ShellStatus = SHELL_OUT_OF_RESOURCES;\r
-          } else {\r
-            UnicodeSPrint(Buffer, StrSize(Data), L"%s", Data);\r
-            ((CHAR16*)Buffer)[StrLen(Buffer)-1] = CHAR_NULL;\r
-\r
-            Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, StrSize(Buffer)-sizeof(CHAR16), Buffer);\r
-            if (EFI_ERROR(Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
-              ShellStatus = SHELL_ACCESS_DENIED;\r
-            } else {\r
-              ASSERT(ShellStatus == SHELL_SUCCESS);\r
-            }\r
-          }\r
-        } else if (StrnCmp(Data, L"--", 2) == 0) {\r
-          //\r
-          // device path in text format\r
-          //\r
-          Data++;\r
-          Data++;\r
-          DevPath = ConvertTextToDevicePath(Data);\r
-          if (DevPath == NULL) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar");  \r
-            ShellStatus = SHELL_INVALID_PARAMETER;\r
-          } else {\r
-            Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, GetDevicePathSize(DevPath), DevPath);\r
-            if (EFI_ERROR(Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
-              ShellStatus = SHELL_ACCESS_DENIED;\r
-            } else {\r
-              ASSERT(ShellStatus == SHELL_SUCCESS);\r
-            }\r
-          }\r
+        Size = 0;\r
+        Status = GetVariableDataFromParameter(Package, (UINT8 **)&Buffer, &Size);\r
+        if (!EFI_ERROR(Status)) {\r
+          Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, Size, Buffer);\r
+        }\r
+        if (EFI_ERROR(Status)) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);\r
+          ShellStatus = SHELL_ACCESS_DENIED;\r
         } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", Data);  \r
-          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          ASSERT(ShellStatus == SHELL_SUCCESS);\r
         }\r
       }\r
     }\r
@@ -291,9 +467,5 @@ ShellCommandRunSetVar (
     FreePool(Buffer);\r
   }\r
 \r
-  if (DevPath != NULL) {\r
-    FreePool(DevPath);\r
-  }\r
-\r
   return (ShellStatus);\r
 }\r