]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c
ShellPkg: Update BCFG command for correct use and errors on moving
[mirror_edk2.git] / ShellPkg / Library / UefiShellInstall1CommandsLib / Bcfg.c
index a7893f5eeede79f85e938ca467b8611e49eaa816..bb81df59ccdf0f95e58f3580d6d8f6e39320eea9 100644 (file)
@@ -665,23 +665,34 @@ BcfgMoveInstall1(
   IN CONST UINT16                 *CurrentOrder,\r
   IN CONST UINTN                  OrderCount,\r
   IN CONST UINT16                 OldLocation,\r
-  IN CONST UINT16                 NewLocation\r
+  IN       UINT16                 NewLocation\r
   )\r
 {\r
   UINT16            *NewOrder;\r
   EFI_STATUS        Status;\r
   UINT16            Temp;\r
 \r
-  NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
-  ASSERT(NewOrder != NULL);\r
+  NewOrder = AllocateCopyPool(OrderCount*sizeof(CurrentOrder[0]), CurrentOrder);\r
+  if (NewOrder == NULL) {\r
+    return (SHELL_OUT_OF_RESOURCES);\r
+  }\r
+\r
+  //\r
+  // correct the new location\r
+  //\r
+  if (NewLocation >= OrderCount) {\r
+    if (OrderCount > 0) {\r
+      NewLocation = (UINT16)OrderCount - 1;\r
+    } else {\r
+      NewLocation = 0;\r
+    }\r
+  }\r
 \r
   Temp = CurrentOrder[OldLocation];\r
-  CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
   CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));\r
   CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));\r
   NewOrder[NewLocation] = Temp;\r
 \r
-\r
   Status = gRT->SetVariable(\r
     Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
     (EFI_GUID*)&gEfiGlobalVariableGuid,\r
@@ -1142,6 +1153,7 @@ ShellCommandRunBcfgInstall (
   BGFG_OPERATION        CurrentOperation;\r
   UINTN                 Length;\r
   UINT64                Intermediate;\r
+  UINT16                Count;\r
 \r
   Length              = 0;\r
   ProblemParam        = NULL;\r
@@ -1228,6 +1240,8 @@ ShellCommandRunBcfgInstall (
       }\r
     }\r
 \r
+    Count = (UINT16) (Length / sizeof(CurrentOperation.Order[0]));\r
+\r
     //\r
     // large block to read the type of operation and verify parameter types for the info.\r
     //\r
@@ -1312,8 +1326,8 @@ ShellCommandRunBcfgInstall (
           } else {\r
             Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
             CurrentOperation.Number1     = (UINT16)Intermediate;\r
-            if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
+            if (CurrentOperation.Number1 > Count){\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Count);\r
               ShellStatus = SHELL_INVALID_PARAMETER;\r
             }\r
           }\r
@@ -1330,24 +1344,24 @@ ShellCommandRunBcfgInstall (
           } else {\r
             Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
             CurrentOperation.Number1     = (UINT16)Intermediate;\r
-            if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
-              ShellStatus = SHELL_INVALID_PARAMETER;\r
-            }\r
-            CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
-            if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
+            if (CurrentOperation.Number1 > Count){\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Count);\r
               ShellStatus = SHELL_INVALID_PARAMETER;\r
             } else {\r
-              Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
-              CurrentOperation.Number2     = (UINT16)Intermediate;\r
-            }\r
-            if (CurrentOperation.Number2 == CurrentOperation.Number1\r
-              ||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))\r
-              ||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))\r
-             ){\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
-              ShellStatus = SHELL_INVALID_PARAMETER;\r
+              CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
+              if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
+                ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
+                ShellStatus = SHELL_INVALID_PARAMETER;\r
+              } else {\r
+                Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
+                CurrentOperation.Number2     = (UINT16)Intermediate;\r
+              }\r
+              if (CurrentOperation.Number2 == CurrentOperation.Number1\r
+                ||CurrentOperation.Number2 >= Count\r
+               ){\r
+                ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Count);\r
+                ShellStatus = SHELL_INVALID_PARAMETER;\r
+              }\r
             }\r
           }\r
         } else {\r
@@ -1364,7 +1378,7 @@ ShellCommandRunBcfgInstall (
         case   BcfgTypeDump:\r
           ShellStatus = BcfgDisplayDumpInstall1(\r
             CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",\r
-            Length / sizeof(CurrentOperation.Order[0]),\r
+            Count,\r
             CurrentOperation.Order,\r
             ShellCommandLineGetFlag(Package, L"-v"));\r
           break;\r
@@ -1372,7 +1386,7 @@ ShellCommandRunBcfgInstall (
           ShellStatus = BcfgMoveInstall1(\r
             CurrentOperation.Target,\r
             CurrentOperation.Order,\r
-            Length / sizeof(CurrentOperation.Order[0]),\r
+            Count,\r
             CurrentOperation.Number1,\r
             CurrentOperation.Number2);\r
           break;\r
@@ -1380,7 +1394,7 @@ ShellCommandRunBcfgInstall (
           ShellStatus = BcfgRemoveInstall1(\r
             CurrentOperation.Target,\r
             CurrentOperation.Order,\r
-            Length / sizeof(CurrentOperation.Order[0]),\r
+            Count,\r
             CurrentOperation.Number1);\r
           break;\r
         case   BcfgTypeAdd:\r
@@ -1391,7 +1405,7 @@ ShellCommandRunBcfgInstall (
             CurrentOperation.FileName,\r
             CurrentOperation.Description==NULL?L"":CurrentOperation.Description,\r
             CurrentOperation.Order,\r
-            Length / sizeof(CurrentOperation.Order[0]),\r
+            Count,\r
             CurrentOperation.Target,\r
             (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),\r
             (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),\r
@@ -1401,7 +1415,7 @@ ShellCommandRunBcfgInstall (
           ShellStatus = BcfgAddOptInstall1(\r
             CurrentOperation.OptData,\r
             CurrentOperation.Order,\r
-            Length / sizeof(CurrentOperation.Order[0]),\r
+            Count,\r
             CurrentOperation.Target);\r
           break;\r
         default:\r