1. Change the implementation of function 'LoadVariableFromFile' to return SHELL_STATUS. 2. Add code to check whether the pointer 'FoundVarName' in 'DmpStore.c' is NULL before used.
Signed-off-by: Shumin Qiu <shumin.qiu@intel.com> Reviewed-by: Ni, Ruiyu <ruiyu.ni@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15112 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -89,11 +89,12 @@ GetAttrType (
|
|||||||
@param[in] Guid The guid of the variables to be loaded.
|
@param[in] Guid The guid of the variables to be loaded.
|
||||||
@param[out] Found TRUE when at least one variable was loaded and set.
|
@param[out] Found TRUE when at least one variable was loaded and set.
|
||||||
|
|
||||||
@retval EFI_VOLUME_CORRUPTED The file is in bad format.
|
@retval SHELL_DEVICE_ERROR Cannot access the file.
|
||||||
@retval EFI_OUT_OF_RESOURCES There is not enough memory to perform the operation.
|
@retval SHELL_VOLUME_CORRUPTED The file is in bad format.
|
||||||
@retval EFI_SUCCESS Successfully load and set the variables.
|
@retval SHELL_OUT_OF_RESOURCES There is not enough memory to perform the operation.
|
||||||
|
@retval SHELL_SUCCESS Successfully load and set the variables.
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
SHELL_STATUS
|
||||||
LoadVariablesFromFile (
|
LoadVariablesFromFile (
|
||||||
IN SHELL_FILE_HANDLE FileHandle,
|
IN SHELL_FILE_HANDLE FileHandle,
|
||||||
IN CONST CHAR16 *Name,
|
IN CONST CHAR16 *Name,
|
||||||
@ -102,6 +103,7 @@ LoadVariablesFromFile (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
SHELL_STATUS ShellStatus;
|
||||||
UINT32 NameSize;
|
UINT32 NameSize;
|
||||||
UINT32 DataSize;
|
UINT32 DataSize;
|
||||||
UINTN BufferSize;
|
UINTN BufferSize;
|
||||||
@ -117,9 +119,11 @@ LoadVariablesFromFile (
|
|||||||
|
|
||||||
Status = ShellGetFileSize (FileHandle, &FileSize);
|
Status = ShellGetFileSize (FileHandle, &FileSize);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return SHELL_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShellStatus = SHELL_SUCCESS;
|
||||||
|
|
||||||
InitializeListHead (&List);
|
InitializeListHead (&List);
|
||||||
|
|
||||||
Position = 0;
|
Position = 0;
|
||||||
@ -130,7 +134,7 @@ LoadVariablesFromFile (
|
|||||||
BufferSize = sizeof (NameSize);
|
BufferSize = sizeof (NameSize);
|
||||||
Status = ShellReadFile (FileHandle, &BufferSize, &NameSize);
|
Status = ShellReadFile (FileHandle, &BufferSize, &NameSize);
|
||||||
if (EFI_ERROR (Status) || (BufferSize != sizeof (NameSize))) {
|
if (EFI_ERROR (Status) || (BufferSize != sizeof (NameSize))) {
|
||||||
Status = EFI_VOLUME_CORRUPTED;
|
ShellStatus = SHELL_VOLUME_CORRUPTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,7 +144,7 @@ LoadVariablesFromFile (
|
|||||||
BufferSize = sizeof (DataSize);
|
BufferSize = sizeof (DataSize);
|
||||||
Status = ShellReadFile (FileHandle, &BufferSize, &DataSize);
|
Status = ShellReadFile (FileHandle, &BufferSize, &DataSize);
|
||||||
if (EFI_ERROR (Status) || (BufferSize != sizeof (DataSize))) {
|
if (EFI_ERROR (Status) || (BufferSize != sizeof (DataSize))) {
|
||||||
Status = EFI_VOLUME_CORRUPTED;
|
ShellStatus = SHELL_VOLUME_CORRUPTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,13 +155,13 @@ LoadVariablesFromFile (
|
|||||||
BufferSize = sizeof (NameSize) + sizeof (DataSize) + RemainingSize;
|
BufferSize = sizeof (NameSize) + sizeof (DataSize) + RemainingSize;
|
||||||
Buffer = AllocatePool (BufferSize);
|
Buffer = AllocatePool (BufferSize);
|
||||||
if (Buffer == NULL) {
|
if (Buffer == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
ShellStatus = SHELL_OUT_OF_RESOURCES;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
BufferSize = RemainingSize;
|
BufferSize = RemainingSize;
|
||||||
Status = ShellReadFile (FileHandle, &BufferSize, (UINT32 *) Buffer + 2);
|
Status = ShellReadFile (FileHandle, &BufferSize, (UINT32 *) Buffer + 2);
|
||||||
if (EFI_ERROR (Status) || (BufferSize != RemainingSize)) {
|
if (EFI_ERROR (Status) || (BufferSize != RemainingSize)) {
|
||||||
Status = EFI_VOLUME_CORRUPTED;
|
ShellStatus = SHELL_VOLUME_CORRUPTED;
|
||||||
FreePool (Buffer);
|
FreePool (Buffer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -175,7 +179,7 @@ LoadVariablesFromFile (
|
|||||||
);
|
);
|
||||||
if (Crc32 != * (UINT32 *) (Buffer + BufferSize)) {
|
if (Crc32 != * (UINT32 *) (Buffer + BufferSize)) {
|
||||||
FreePool (Buffer);
|
FreePool (Buffer);
|
||||||
Status = EFI_VOLUME_CORRUPTED;
|
ShellStatus = SHELL_VOLUME_CORRUPTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +188,7 @@ LoadVariablesFromFile (
|
|||||||
Variable = AllocateZeroPool (sizeof (*Variable) + NameSize + DataSize);
|
Variable = AllocateZeroPool (sizeof (*Variable) + NameSize + DataSize);
|
||||||
if (Variable == NULL) {
|
if (Variable == NULL) {
|
||||||
FreePool (Buffer);
|
FreePool (Buffer);
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
ShellStatus = SHELL_OUT_OF_RESOURCES;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Variable->Signature = DMP_STORE_VARIABLE_SIGNATURE;
|
Variable->Signature = DMP_STORE_VARIABLE_SIGNATURE;
|
||||||
@ -200,13 +204,15 @@ LoadVariablesFromFile (
|
|||||||
FreePool (Buffer);
|
FreePool (Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Position != FileSize) || EFI_ERROR (Status)) {
|
if ((Position != FileSize) || (ShellStatus != SHELL_SUCCESS)) {
|
||||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_BAD_FILE), gShellDebug1HiiHandle);
|
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_BAD_FILE), gShellDebug1HiiHandle);
|
||||||
Status = EFI_VOLUME_CORRUPTED;
|
if (Position != FileSize) {
|
||||||
|
ShellStatus = SHELL_VOLUME_CORRUPTED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( Link = GetFirstNode (&List)
|
for ( Link = GetFirstNode (&List)
|
||||||
; !IsNull (&List, Link) && !EFI_ERROR (Status)
|
; !IsNull (&List, Link) && (ShellStatus == SHELL_SUCCESS)
|
||||||
; Link = GetNextNode (&List, Link)
|
; Link = GetNextNode (&List, Link)
|
||||||
) {
|
) {
|
||||||
Variable = CR (Link, DMP_STORE_VARIABLE, Link, DMP_STORE_VARIABLE_SIGNATURE);
|
Variable = CR (Link, DMP_STORE_VARIABLE, Link, DMP_STORE_VARIABLE_SIGNATURE);
|
||||||
@ -231,10 +237,6 @@ LoadVariablesFromFile (
|
|||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), gShellDebug1HiiHandle, Variable->Name, Status);
|
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), gShellDebug1HiiHandle, Variable->Name, Status);
|
||||||
//
|
|
||||||
// continue set variable upon failure
|
|
||||||
//
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -245,7 +247,7 @@ LoadVariablesFromFile (
|
|||||||
FreePool (Variable);
|
FreePool (Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return ShellStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -457,7 +459,7 @@ CascadeProcessVariables (
|
|||||||
//
|
//
|
||||||
// Last error check then print this variable out.
|
// Last error check then print this variable out.
|
||||||
//
|
//
|
||||||
if (!EFI_ERROR(Status) && DataBuffer != NULL) {
|
if (!EFI_ERROR(Status) && (DataBuffer != NULL) && (FoundVarName != NULL)) {
|
||||||
RetString = GetAttrType(Atts);
|
RetString = GetAttrType(Atts);
|
||||||
ShellPrintHiiEx(
|
ShellPrintHiiEx(
|
||||||
-1,
|
-1,
|
||||||
@ -546,7 +548,7 @@ ProcessVariables (
|
|||||||
ZeroMem (&FoundVarGuid, sizeof(EFI_GUID));
|
ZeroMem (&FoundVarGuid, sizeof(EFI_GUID));
|
||||||
|
|
||||||
if (Type == DmpStoreLoad) {
|
if (Type == DmpStoreLoad) {
|
||||||
ShellStatus = (SHELL_STATUS) LoadVariablesFromFile (FileHandle, Name, Guid, &Found);
|
ShellStatus = LoadVariablesFromFile (FileHandle, Name, Guid, &Found);
|
||||||
} else {
|
} else {
|
||||||
ShellStatus = CascadeProcessVariables(Name, Guid, Type, FileHandle, NULL, FoundVarGuid, &Found);
|
ShellStatus = CascadeProcessVariables(Name, Guid, Type, FileHandle, NULL, FoundVarGuid, &Found);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user