MdeModulePkg/SecurityPkg Variable: Add boundary check for while (IsValidVariableHeader (Variable)).
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16280 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -3,7 +3,7 @@
|
||||
Implement ReadOnly Variable Services required by PEIM and install
|
||||
PEI ReadOnly Varaiable2 PPI. These services operates the non volatile storage space.
|
||||
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@ -547,14 +547,25 @@ GetVariableHeader (
|
||||
EFI_HOB_GUID_TYPE *GuidHob;
|
||||
UINTN PartialHeaderSize;
|
||||
|
||||
if (Variable == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// First assume variable header pointed by Variable is consecutive.
|
||||
//
|
||||
*VariableHeader = Variable;
|
||||
|
||||
if ((Variable != NULL) && (StoreInfo->FtwLastWriteData != NULL)) {
|
||||
if (StoreInfo->FtwLastWriteData != NULL) {
|
||||
TargetAddress = StoreInfo->FtwLastWriteData->TargetAddress;
|
||||
SpareAddress = StoreInfo->FtwLastWriteData->SpareAddress;
|
||||
if (((UINTN) Variable > (UINTN) SpareAddress) &&
|
||||
(((UINTN) Variable - (UINTN) SpareAddress + (UINTN) TargetAddress) >= (UINTN) GetEndPointer (StoreInfo->VariableStoreHeader))) {
|
||||
//
|
||||
// Reach the end of variable store.
|
||||
//
|
||||
return FALSE;
|
||||
}
|
||||
if (((UINTN) Variable < (UINTN) TargetAddress) && (((UINTN) Variable + sizeof (VARIABLE_HEADER)) > (UINTN) TargetAddress)) {
|
||||
//
|
||||
// Variable header pointed by Variable is inconsecutive,
|
||||
@ -576,6 +587,13 @@ GetVariableHeader (
|
||||
CopyMem ((UINT8 *) *VariableHeader + PartialHeaderSize, (UINT8 *) (UINTN) SpareAddress, sizeof (VARIABLE_HEADER) - PartialHeaderSize);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (Variable >= GetEndPointer (StoreInfo->VariableStoreHeader)) {
|
||||
//
|
||||
// Reach the end of variable store.
|
||||
//
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return IsValidVariableHeader (*VariableHeader);
|
||||
|
Reference in New Issue
Block a user