mirror of https://github.com/acidanthera/audk.git
MdeModulePkg PCD: Fix PCD driver to return default data if size mismatch.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15357 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
68d151bbc9
commit
553e86699d
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Help functions used by PCD DXE driver.
|
||||
|
||||
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
|
||||
|
@ -457,18 +457,25 @@ GetWorker (
|
|||
// string array in string table.
|
||||
//
|
||||
StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);
|
||||
VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx);
|
||||
VaraiableDefaultBuffer = (UINT8 *) (StringTable + StringTableIdx);
|
||||
} else {
|
||||
VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;
|
||||
}
|
||||
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
|
||||
if (Status == EFI_SUCCESS) {
|
||||
if (DataSize >= (VariableHead->Offset + GetSize)) {
|
||||
if (GetSize == 0) {
|
||||
//
|
||||
// It is a pointer type. So get the MaxSize reserved for
|
||||
// this PCD entry.
|
||||
//
|
||||
GetPtrTypeSize (TmpTokenNumber, &GetSize);
|
||||
if (GetSize > (DataSize - VariableHead->Offset)) {
|
||||
//
|
||||
// Use actual valid size.
|
||||
//
|
||||
GetSize = DataSize - VariableHead->Offset;
|
||||
}
|
||||
}
|
||||
//
|
||||
// If the operation is successful, we copy the data
|
||||
|
@ -476,6 +483,7 @@ GetWorker (
|
|||
// So that we can free the Data allocated in GetHiiVariable.
|
||||
//
|
||||
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);
|
||||
}
|
||||
FreePool (Data);
|
||||
}
|
||||
RetPtr = (VOID *) VaraiableDefaultBuffer;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
The driver internal functions are implmented here.
|
||||
They build Pei PCD database, and provide access service to PCD database.
|
||||
|
||||
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
|
||||
|
@ -947,6 +947,7 @@ GetWorker (
|
|||
PEI_PCD_DATABASE *PeiPcdDb;
|
||||
UINT32 LocalTokenNumber;
|
||||
UINT32 LocalTokenCount;
|
||||
UINT8 *VaraiableDefaultBuffer;
|
||||
|
||||
//
|
||||
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
|
||||
|
@ -986,20 +987,37 @@ GetWorker (
|
|||
Guid = (EFI_GUID *) ((UINT8 *)PeiPcdDb + PeiPcdDb->GuidTableOffset) + VariableHead->GuidTableIndex;
|
||||
Name = (UINT16*)&StringTable[VariableHead->StringIndex];
|
||||
|
||||
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
|
||||
|
||||
if (Status == EFI_SUCCESS) {
|
||||
return (VOID *) ((UINT8 *) Data + VariableHead->Offset);
|
||||
} else {
|
||||
//
|
||||
// Return the default value specified by Platform Integrator
|
||||
//
|
||||
if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {
|
||||
return (VOID*)&StringTable[*(STRING_HEAD*)((UINT8*)PeiPcdDb + VariableHead->DefaultValueOffset)];
|
||||
//
|
||||
// If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of
|
||||
// string array in string table.
|
||||
//
|
||||
VaraiableDefaultBuffer = (UINT8 *) &StringTable[*(STRING_HEAD*)((UINT8*) PeiPcdDb + VariableHead->DefaultValueOffset)];
|
||||
} else {
|
||||
return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);
|
||||
VaraiableDefaultBuffer = (UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset;
|
||||
}
|
||||
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
|
||||
if ((Status == EFI_SUCCESS) && (DataSize >= (VariableHead->Offset + GetSize))) {
|
||||
if (GetSize == 0) {
|
||||
//
|
||||
// It is a pointer type. So get the MaxSize reserved for
|
||||
// this PCD entry.
|
||||
//
|
||||
GetPtrTypeSize (TokenNumber, &GetSize, PeiPcdDb);
|
||||
if (GetSize > (DataSize - VariableHead->Offset)) {
|
||||
//
|
||||
// Use actual valid size.
|
||||
//
|
||||
GetSize = DataSize - VariableHead->Offset;
|
||||
}
|
||||
}
|
||||
//
|
||||
// If the operation is successful, we copy the data
|
||||
// to the default value buffer in the PCD Database.
|
||||
//
|
||||
CopyMem (VaraiableDefaultBuffer, (UINT8 *) Data + VariableHead->Offset, GetSize);
|
||||
}
|
||||
return (VOID *) VaraiableDefaultBuffer;
|
||||
}
|
||||
|
||||
case PCD_TYPE_DATA:
|
||||
|
|
Loading…
Reference in New Issue