]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c
ShellPkg/for: Fix potential null pointer deference
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / DrvCfg.c
index 2ff330c38be5c857567caa68b4c809d7fcef8460..37501d4d3fdcfb5d0abc9864750861e52e1273d1 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for DrvCfg shell Driver1 function.\r
 \r
-  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -29,7 +30,6 @@ STATIC CONST EFI_GUID *CfgGuidList[] = {&gEfiDriverConfigurationProtocolGuid, &g
   @retval EFI_NOT_FOUND   There was no EFI_HII_HANDLE found for that deviec path.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 FindHiiHandleViaDevPath(\r
   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath1,\r
   OUT EFI_HII_HANDLE                *HiiHandle,\r
@@ -56,8 +56,11 @@ FindHiiHandleViaDevPath(
   Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
     HandleBuffer = AllocateZeroPool(HandleBufferSize);\r
-    ASSERT (HandleBuffer != NULL);\r
-    Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
+    if (HandleBuffer == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+    } else {\r
+      Status = HiiDb->ListPackageLists (HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
+    }\r
   }\r
   if (EFI_ERROR(Status)) {\r
     SHELL_FREE_NON_NULL(HandleBuffer);\r
@@ -74,8 +77,12 @@ FindHiiHandleViaDevPath(
     Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
       MainBuffer = AllocateZeroPool(MainBufferSize);\r
-      ASSERT (MainBuffer != NULL);\r
-      Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
+      if (MainBuffer != NULL) {\r
+        Status = HiiDb->ExportPackageLists (HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
+      }\r
+    }\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
     }\r
     //\r
     // Enumerate through the block of returned memory.\r
@@ -116,7 +123,6 @@ FindHiiHandleViaDevPath(
   @retval EFI_SUCCESS   The operation was successful.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 ConvertHandleToHiiHandle(\r
   IN CONST EFI_HANDLE           Handle,\r
   OUT EFI_HII_HANDLE            *HiiHandle,\r
@@ -151,7 +157,6 @@ ConvertHandleToHiiHandle(
   @param[in] FileName         The filename to rwite the info to.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 ConfigToFile(\r
   IN CONST EFI_HANDLE     Handle,\r
   IN CONST CHAR16         *FileName\r
@@ -175,8 +180,9 @@ ConfigToFile(
       -1,\r
       -1,\r
       NULL,\r
-      STRING_TOKEN(STR_GEN_FILE_OPEN), \r
-      gShellDriver1HiiHandle, \r
+      STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL),\r
+      gShellDriver1HiiHandle,\r
+      L"drvcfg",\r
       FileName, \r
       Status);\r
     return (SHELL_DEVICE_ERROR);\r
@@ -197,13 +203,15 @@ ConfigToFile(
       -1, \r
       NULL,\r
       STRING_TOKEN(STR_GEN_PROTOCOL_NF), \r
-      gShellDriver1HiiHandle, \r
+      gShellDriver1HiiHandle,\r
+      L"drvcfg",\r
       L"EfiHiiDatabaseProtocol", \r
       &gEfiHiiDatabaseProtocolGuid);\r
     ShellCloseFile(&FileHandle);\r
     return (SHELL_NOT_FOUND);\r
   }\r
 \r
+  HiiHandle = NULL;\r
   Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);\r
   if (EFI_ERROR(Status)) {\r
     ShellPrintHiiEx(\r
@@ -211,7 +219,8 @@ ConfigToFile(
       -1, \r
       NULL, \r
       STRING_TOKEN(STR_GEN_HANDLE_NOT), \r
-      gShellDriver1HiiHandle, \r
+      gShellDriver1HiiHandle,\r
+      L"drvcfg",\r
       ConvertHandleToHandleIndex(Handle), \r
       L"Device");\r
     ShellCloseFile(&FileHandle);\r
@@ -235,9 +244,9 @@ ConfigToFile(
       -1,\r
       NULL,\r
       STRING_TOKEN(STR_FILE_WRITE_FAIL), \r
-      gShellDriver1HiiHandle, \r
-      FileName, \r
-      Status);\r
+      gShellDriver1HiiHandle,\r
+      L"drvcfg",\r
+      FileName);\r
     return (SHELL_DEVICE_ERROR);   \r
   }\r
   ShellPrintHiiEx(\r
@@ -257,7 +266,6 @@ ConfigToFile(
   @param[in] FileName         The filename to read the info from.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 ConfigFromFile(\r
   IN       EFI_HANDLE     Handle,\r
   IN CONST CHAR16         *FileName\r
@@ -287,8 +295,9 @@ ConfigFromFile(
       -1,\r
       -1,\r
       NULL,\r
-      STRING_TOKEN(STR_GEN_FILE_OPEN), \r
+      STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL),\r
       gShellDriver1HiiHandle, \r
+      L"drvcfg",\r
       FileName, \r
       Status);\r
     return (SHELL_DEVICE_ERROR);\r
@@ -310,6 +319,7 @@ ConfigFromFile(
       NULL,\r
       STRING_TOKEN(STR_GEN_PROTOCOL_NF), \r
       gShellDriver1HiiHandle, \r
+      L"drvcfg",\r
       L"EfiHiiDatabaseProtocol", \r
       &gEfiHiiDatabaseProtocolGuid);\r
     ShellCloseFile(&FileHandle);\r
@@ -324,9 +334,10 @@ ConfigFromFile(
       -1, \r
       NULL, \r
       STRING_TOKEN(STR_FILE_READ_FAIL), \r
-      gShellDriver1HiiHandle, \r
-      FileName,\r
-      Status);\r
+      gShellDriver1HiiHandle,\r
+      L"drvcfg",\r
+      FileName);\r
+\r
     ShellCloseFile(&FileHandle);\r
     return (SHELL_DEVICE_ERROR);   \r
   }\r
@@ -337,7 +348,7 @@ ConfigFromFile(
       -1, \r
       NULL, \r
       STRING_TOKEN(STR_GEN_OUT_MEM), \r
-      gShellDriver1HiiHandle);\r
+      gShellDriver1HiiHandle, L"drvcfg");\r
     ShellCloseFile(&FileHandle);\r
     return (SHELL_DEVICE_ERROR);   \r
   }\r
@@ -349,8 +360,9 @@ ConfigFromFile(
       NULL, \r
       STRING_TOKEN(STR_FILE_READ_FAIL), \r
       gShellDriver1HiiHandle, \r
-      FileName,\r
-      Status);\r
+      L"drvcfg",\r
+      FileName);\r
+\r
     ShellCloseFile(&FileHandle);\r
     SHELL_FREE_NON_NULL(MainBuffer);\r
     return (SHELL_DEVICE_ERROR);   \r
@@ -370,7 +382,7 @@ ConfigFromFile(
         -1, \r
         NULL, \r
         STRING_TOKEN(STR_GEN_HANDLE_NOT), \r
-        gShellDriver1HiiHandle, \r
+        gShellDriver1HiiHandle, L"drvcfg",\r
         ConvertHandleToHandleIndex(Handle), \r
         L"Device");\r
       ShellCloseFile(&FileHandle);\r
@@ -382,8 +394,9 @@ ConfigFromFile(
         -1, \r
         -1, \r
         NULL, \r
-        STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), \r
-        gShellDriver1HiiHandle, \r
+        STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN),\r
+        gShellDriver1HiiHandle,\r
+        L"drvcfg",\r
         L"HiiDatabase->UpdatePackageList", \r
         Status);\r
       return (SHELL_DEVICE_ERROR);   \r
@@ -422,8 +435,9 @@ ConfigFromFile(
                     -1, \r
                     -1, \r
                     NULL, \r
-                    STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), \r
+                    STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN),\r
                     gShellDriver1HiiHandle, \r
+                    L"drvcfg",\r
                     L"HiiDatabase->UpdatePackageList", \r
                     Status);\r
                   return (SHELL_DEVICE_ERROR);\r
@@ -468,7 +482,6 @@ ConfigFromFile(
   @retval SHELL_INVALID_PARAMETER   A parameter has a invalid value.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 ShellCmdDriverConfigurationProcessActionRequired (\r
   EFI_HANDLE                                DriverImageHandle,\r
   EFI_HANDLE                                ControllerHandle,\r
@@ -536,7 +549,6 @@ ShellCmdDriverConfigurationProcessActionRequired (
   @retval SHELL_INVALID_PARAMETER   A parameter has a invalid value.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 PreHiiDrvCfg (\r
   IN CONST CHAR8    *Language,\r
   IN BOOLEAN        ForceDefaults,\r
@@ -667,8 +679,9 @@ PreHiiDrvCfg (
         -1,\r
         -1,\r
         NULL,\r
-        STRING_TOKEN (STR_GEN_PROBLEM_VAL),\r
+        STRING_TOKEN (STR_GEN_NO_VALUE),\r
         gShellDriver1HiiHandle,\r
+        L"drvcfg",\r
         L"-l"\r
         );\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
@@ -1043,7 +1056,6 @@ Done:
   @retval SHELL_SUCCESS     The operation was successful.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 PrintConfigInfoOnAll(\r
   IN CONST BOOLEAN ChildrenToo,\r
   IN CONST CHAR8   *Language,\r
@@ -1159,6 +1171,7 @@ ShellCommandRunDrvCfg (
   Status              = EFI_SUCCESS;\r
   Language            = NULL;\r
   UseHii              = TRUE;\r
+  ProblemParam        = NULL;\r
 \r
   //\r
   // initialize the shell lib (we must be in non-auto-init...)\r
@@ -1182,7 +1195,7 @@ ShellCommandRunDrvCfg (
     Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE);\r
     if (EFI_ERROR(Status)) {\r
       if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvcfg", ProblemParam);\r
         FreePool(ProblemParam);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
@@ -1192,12 +1205,17 @@ ShellCommandRunDrvCfg (
     }\r
   } \r
   if (ShellStatus == SHELL_SUCCESS) {\r
+    if (ShellCommandLineGetCount(Package) > 4) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvcfg");\r
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
+      goto Done;\r
+    }\r
     Lang = ShellCommandLineGetValue(Package, L"-l");\r
     if (Lang != NULL) {\r
       Language = AllocateZeroPool(StrSize(Lang));\r
       AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
     } else if (ShellCommandLineGetFlag(Package, L"-l")){\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg",  L"-l");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     }\r
@@ -1218,24 +1236,24 @@ ShellCommandRunDrvCfg (
     }\r
 \r
     if (InFromFile && EFI_ERROR(ShellFileExists(FileName))) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, FileName);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, L"drvcfg", FileName);  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;      \r
     }\r
     if (OutToFile && !EFI_ERROR(ShellFileExists(FileName))) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, FileName);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, L"drvcfg", FileName);  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;      \r
     }\r
     if (Force && ForceTypeString == NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-f");\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-f");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     } \r
     if (Force) {\r
       Status = ShellConvertStringToUint64(ForceTypeString, &Intermediate, FALSE, FALSE);\r
       if (EFI_ERROR(Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"-f");\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"drvcfg", ForceTypeString, L"-f");  \r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1248,7 +1266,7 @@ ShellCommandRunDrvCfg (
     if (HandleIndex1 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1, &Intermediate, TRUE, FALSE))) {\r
       Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
       if (Handle1 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex1);\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex1);  \r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1258,7 +1276,7 @@ ShellCommandRunDrvCfg (
     if (HandleIndex2 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2, &Intermediate, TRUE, FALSE))) {\r
       Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
       if (Handle2 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex2);\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex2);  \r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1268,7 +1286,7 @@ ShellCommandRunDrvCfg (
     if (HandleIndex3 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3, &Intermediate, TRUE, FALSE))) {\r
       Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
       if (Handle3 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex3);\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex3);  \r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1276,42 +1294,42 @@ ShellCommandRunDrvCfg (
 \r
     if ((InFromFile || OutToFile) && (FileName == NULL)) {\r
       if (FileName == NULL) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, InFromFile?L"-i":L"-o");\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg",  InFromFile?L"-i":L"-o");  \r
       } else {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle);\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle, L"drvcfg");  \r
       }\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     }\r
     if (!UseHii && (InFromFile || OutToFile)) {\r
       if (InFromFile) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-i");\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-i");  \r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       } \r
       if (OutToFile) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-o");\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-o");  \r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
     }\r
     if (Validate && Force) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-f");\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-f");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     } \r
     if (Validate && Set) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-s");\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-s");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     } \r
     if (Set && Force) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-s", L"-f");\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-s", L"-f");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     }\r
     if (OutToFile && InFromFile) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-i", L"-o");\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-i", L"-o");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto Done;\r
     }\r