mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-06 13:24:23 +02:00
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
|
/** @file
|
||||||
Help functions used by PCD DXE driver.
|
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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -457,18 +457,25 @@ GetWorker (
|
|||||||
// string array in string table.
|
// string array in string table.
|
||||||
//
|
//
|
||||||
StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);
|
StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);
|
||||||
VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx);
|
VaraiableDefaultBuffer = (UINT8 *) (StringTable + StringTableIdx);
|
||||||
} else {
|
} else {
|
||||||
VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;
|
VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;
|
||||||
}
|
}
|
||||||
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
|
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);
|
||||||
if (Status == EFI_SUCCESS) {
|
if (Status == EFI_SUCCESS) {
|
||||||
|
if (DataSize >= (VariableHead->Offset + GetSize)) {
|
||||||
if (GetSize == 0) {
|
if (GetSize == 0) {
|
||||||
//
|
//
|
||||||
// It is a pointer type. So get the MaxSize reserved for
|
// It is a pointer type. So get the MaxSize reserved for
|
||||||
// this PCD entry.
|
// this PCD entry.
|
||||||
//
|
//
|
||||||
GetPtrTypeSize (TmpTokenNumber, &GetSize);
|
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
|
// If the operation is successful, we copy the data
|
||||||
@ -476,6 +483,7 @@ GetWorker (
|
|||||||
// So that we can free the Data allocated in GetHiiVariable.
|
// So that we can free the Data allocated in GetHiiVariable.
|
||||||
//
|
//
|
||||||
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);
|
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);
|
||||||
|
}
|
||||||
FreePool (Data);
|
FreePool (Data);
|
||||||
}
|
}
|
||||||
RetPtr = (VOID *) VaraiableDefaultBuffer;
|
RetPtr = (VOID *) VaraiableDefaultBuffer;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
The driver internal functions are implmented here.
|
The driver internal functions are implmented here.
|
||||||
They build Pei PCD database, and provide access service to PCD database.
|
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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -947,6 +947,7 @@ GetWorker (
|
|||||||
PEI_PCD_DATABASE *PeiPcdDb;
|
PEI_PCD_DATABASE *PeiPcdDb;
|
||||||
UINT32 LocalTokenNumber;
|
UINT32 LocalTokenNumber;
|
||||||
UINT32 LocalTokenCount;
|
UINT32 LocalTokenCount;
|
||||||
|
UINT8 *VaraiableDefaultBuffer;
|
||||||
|
|
||||||
//
|
//
|
||||||
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
|
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
|
||||||
@ -986,20 +987,37 @@ GetWorker (
|
|||||||
Guid = (EFI_GUID *) ((UINT8 *)PeiPcdDb + PeiPcdDb->GuidTableOffset) + VariableHead->GuidTableIndex;
|
Guid = (EFI_GUID *) ((UINT8 *)PeiPcdDb + PeiPcdDb->GuidTableOffset) + VariableHead->GuidTableIndex;
|
||||||
Name = (UINT16*)&StringTable[VariableHead->StringIndex];
|
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)) {
|
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 {
|
} 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:
|
case PCD_TYPE_DATA:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user