ShellPkg: Update BCFG command for correct use and errors on moving
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jaben Carsey <jaben.carsey@intel.com> Reviewed-by: Tapan Shah <tapandshah@hp.com> Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16060 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -667,23 +667,34 @@ BcfgMoveDebug1(
|
||||
IN CONST UINT16 *CurrentOrder,
|
||||
IN CONST UINTN OrderCount,
|
||||
IN CONST UINT16 OldLocation,
|
||||
IN CONST UINT16 NewLocation
|
||||
IN UINT16 NewLocation
|
||||
)
|
||||
{
|
||||
UINT16 *NewOrder;
|
||||
EFI_STATUS Status;
|
||||
UINT16 Temp;
|
||||
|
||||
NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));
|
||||
ASSERT(NewOrder != NULL);
|
||||
NewOrder = AllocateCopyPool(OrderCount*sizeof(CurrentOrder[0]), CurrentOrder);
|
||||
if (NewOrder == NULL) {
|
||||
return (SHELL_OUT_OF_RESOURCES);
|
||||
}
|
||||
|
||||
//
|
||||
// correct the new location
|
||||
//
|
||||
if (NewLocation >= OrderCount) {
|
||||
if (OrderCount > 0) {
|
||||
NewLocation = (UINT16)OrderCount - 1;
|
||||
} else {
|
||||
NewLocation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Temp = CurrentOrder[OldLocation];
|
||||
CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));
|
||||
CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));
|
||||
CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));
|
||||
NewOrder[NewLocation] = Temp;
|
||||
|
||||
|
||||
Status = gRT->SetVariable(
|
||||
Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",
|
||||
(EFI_GUID*)&gEfiGlobalVariableGuid,
|
||||
@ -1146,6 +1157,7 @@ ShellCommandRunBcfg (
|
||||
BGFG_OPERATION CurrentOperation;
|
||||
UINTN Length;
|
||||
UINT64 Intermediate;
|
||||
UINT16 Count;
|
||||
|
||||
Length = 0;
|
||||
ProblemParam = NULL;
|
||||
@ -1232,6 +1244,8 @@ ShellCommandRunBcfg (
|
||||
}
|
||||
}
|
||||
|
||||
Count = (UINT16) (Length / sizeof(CurrentOperation.Order[0]));
|
||||
|
||||
//
|
||||
// large block to read the type of operation and verify parameter types for the info.
|
||||
//
|
||||
@ -1316,8 +1330,8 @@ ShellCommandRunBcfg (
|
||||
} else {
|
||||
Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
|
||||
CurrentOperation.Number1 = (UINT16)Intermediate;
|
||||
if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));
|
||||
if (CurrentOperation.Number1 > Count){
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Count);
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
@ -1334,24 +1348,24 @@ ShellCommandRunBcfg (
|
||||
} else {
|
||||
Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
|
||||
CurrentOperation.Number1 = (UINT16)Intermediate;
|
||||
if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
}
|
||||
CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
|
||||
if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
|
||||
if (CurrentOperation.Number1 > Count){
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Count);
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
} else {
|
||||
Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
|
||||
CurrentOperation.Number2 = (UINT16)Intermediate;
|
||||
}
|
||||
if (CurrentOperation.Number2 == CurrentOperation.Number1
|
||||
||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))
|
||||
||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))
|
||||
){
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
|
||||
if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
} else {
|
||||
Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
|
||||
CurrentOperation.Number2 = (UINT16)Intermediate;
|
||||
}
|
||||
if (CurrentOperation.Number2 == CurrentOperation.Number1
|
||||
||CurrentOperation.Number2 >= Count
|
||||
){
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Count);
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -1368,7 +1382,7 @@ ShellCommandRunBcfg (
|
||||
case BcfgTypeDump:
|
||||
ShellStatus = BcfgDisplayDumpDebug1(
|
||||
CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",
|
||||
Length / sizeof(CurrentOperation.Order[0]),
|
||||
Count,
|
||||
CurrentOperation.Order,
|
||||
ShellCommandLineGetFlag(Package, L"-v"));
|
||||
break;
|
||||
@ -1376,7 +1390,7 @@ ShellCommandRunBcfg (
|
||||
ShellStatus = BcfgMoveDebug1(
|
||||
CurrentOperation.Target,
|
||||
CurrentOperation.Order,
|
||||
Length / sizeof(CurrentOperation.Order[0]),
|
||||
Count,
|
||||
CurrentOperation.Number1,
|
||||
CurrentOperation.Number2);
|
||||
break;
|
||||
@ -1384,7 +1398,7 @@ ShellCommandRunBcfg (
|
||||
ShellStatus = BcfgRemoveDebug1(
|
||||
CurrentOperation.Target,
|
||||
CurrentOperation.Order,
|
||||
Length / sizeof(CurrentOperation.Order[0]),
|
||||
Count,
|
||||
CurrentOperation.Number1);
|
||||
break;
|
||||
case BcfgTypeAdd:
|
||||
@ -1395,7 +1409,7 @@ ShellCommandRunBcfg (
|
||||
CurrentOperation.FileName,
|
||||
CurrentOperation.Description==NULL?L"":CurrentOperation.Description,
|
||||
CurrentOperation.Order,
|
||||
Length / sizeof(CurrentOperation.Order[0]),
|
||||
Count,
|
||||
CurrentOperation.Target,
|
||||
(BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),
|
||||
(BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),
|
||||
@ -1405,7 +1419,7 @@ ShellCommandRunBcfg (
|
||||
ShellStatus = BcfgAddOptDebug1(
|
||||
CurrentOperation.OptData,
|
||||
CurrentOperation.Order,
|
||||
Length / sizeof(CurrentOperation.Order[0]),
|
||||
Count,
|
||||
CurrentOperation.Target);
|
||||
break;
|
||||
default:
|
||||
|
Reference in New Issue
Block a user