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
BGFG_OPERATION CurrentOperation;\r
UINTN Length;\r
UINT64 Intermediate;\r
+ UINT16 Count;\r
\r
Length = 0;\r
ProblemParam = NULL;\r
}\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
} 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
} 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
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
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
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
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
ShellStatus = BcfgAddOptInstall1(\r
CurrentOperation.OptData,\r
CurrentOperation.Order,\r
- Length / sizeof(CurrentOperation.Order[0]),\r
+ Count,\r
CurrentOperation.Target);\r
break;\r
default:\r