mirror of https://github.com/acidanthera/audk.git
Fix the issue that the variable Unicode string may be not aligned on 16-bit boundary in flash (it dependent on ALIGNMENT macro in EdkModulePkg\Universal\Variable\Pei\x64\VarMachine.h). The unalignment Unicode string will lead assert of StrCmp, StrCopy, StrLen function in Mde library.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2482 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7af45bf1f0
commit
bb60dd97af
|
@ -58,44 +58,6 @@ ReleaseLockOnlyAtBootTime (
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
STATIC
|
||||
UINT32
|
||||
EFIAPI
|
||||
ArrayLength (
|
||||
IN CHAR16 *String
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Determine the length of null terminated char16 array.
|
||||
|
||||
Arguments:
|
||||
|
||||
String Null-terminated CHAR16 array pointer.
|
||||
|
||||
Returns:
|
||||
|
||||
UINT32 Number of bytes in the string, including the double NULL at the end;
|
||||
|
||||
--*/
|
||||
{
|
||||
UINT32 Count;
|
||||
|
||||
if (NULL == String) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Count = 0;
|
||||
|
||||
while (0 != String[Count]) {
|
||||
Count++;
|
||||
}
|
||||
|
||||
return (Count * 2) + 2;
|
||||
}
|
||||
|
||||
STATIC
|
||||
UINT8 *
|
||||
EFIAPI
|
||||
|
@ -269,7 +231,7 @@ Returns:
|
|||
return EFI_SUCCESS;
|
||||
} else {
|
||||
if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) {
|
||||
if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable[Index]), ArrayLength (VariableName))) {
|
||||
if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable[Index]), Variable[Index]->NameSize)) {
|
||||
PtrTrack->CurrPtr = Variable[Index];
|
||||
PtrTrack->Volatile = (BOOLEAN) Index;
|
||||
return EFI_SUCCESS;
|
||||
|
@ -529,7 +491,7 @@ Returns:
|
|||
//
|
||||
Status = EFI_WRITE_PROTECTED;
|
||||
goto Done;
|
||||
} else if (sizeof (VARIABLE_HEADER) + (ArrayLength (VariableName) + DataSize) > MAX_VARIABLE_SIZE) {
|
||||
} else if (sizeof (VARIABLE_HEADER) + (StrSize (VariableName) + DataSize) > MAX_VARIABLE_SIZE) {
|
||||
//
|
||||
// The size of the VariableName, including the Unicode Null in bytes plus
|
||||
// the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes.
|
||||
|
@ -590,7 +552,7 @@ Returns:
|
|||
// Create a new variable and copy the data.
|
||||
//
|
||||
VarNameOffset = sizeof (VARIABLE_HEADER);
|
||||
VarNameSize = ArrayLength (VariableName);
|
||||
VarNameSize = StrSize (VariableName);
|
||||
VarDataOffset = VarNameOffset + VarNameSize + GET_PAD_SIZE (VarNameSize);
|
||||
VarSize = VarDataOffset + DataSize + GET_PAD_SIZE (DataSize);
|
||||
|
||||
|
|
|
@ -43,6 +43,9 @@
|
|||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseLib</Keyword>
|
||||
</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>Variable.h</Filename>
|
||||
|
|
|
@ -46,6 +46,9 @@
|
|||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseLib</Keyword>
|
||||
</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>Variable.h</Filename>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
Copyright (c) 2006 - 2007 Intel Corporation. <BR>
|
||||
All rights reserved. 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
|
||||
|
@ -209,7 +209,7 @@ Returns:
|
|||
(((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&
|
||||
(((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])
|
||||
) {
|
||||
if (!StrCmp (VariableName, GET_VARIABLE_NAME_PTR (Variable))) {
|
||||
if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), Variable->NameSize)) {
|
||||
PtrTrack->CurrPtr = Variable;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<MsaHeader>
|
||||
<ModuleName>PeiVariable</ModuleName>
|
||||
|
@ -8,11 +8,11 @@
|
|||
<Abstract>Component description file for PeiVariable module.</Abstract>
|
||||
<Description>Framework PEIM to provide the Variable functionality.</Description>
|
||||
<Copyright>Copyright (c) 2006 - 2007, Intel Corporation</Copyright>
|
||||
<License>All rights reserved. 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
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
<License>All rights reserved. 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
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
|
||||
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
|
||||
</MsaHeader>
|
||||
|
@ -37,6 +37,9 @@
|
|||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>PcdLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseMemoryLib</Keyword>
|
||||
</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>Variable.h</Filename>
|
||||
|
@ -67,7 +70,7 @@
|
|||
<PcdEntry PcdItemType="DYNAMIC">
|
||||
<C_Name>PcdFlashNvStorageVariableBase</C_Name>
|
||||
<TokenSpaceGuidCName>gEfiGenericPlatformTokenSpaceGuid</TokenSpaceGuidCName>
|
||||
<HelpText>The driver gets the Variable store base address from this PCD. This base address point to
|
||||
<HelpText>The driver gets the Variable store base address from this PCD. This base address point to
|
||||
an EFI_FIRMWARE_VOLUMN_HEADER struct.</HelpText>
|
||||
</PcdEntry>
|
||||
</PcdCoded>
|
||||
|
|
|
@ -59,43 +59,6 @@ ReleaseLockOnlyAtBootTime (
|
|||
}
|
||||
}
|
||||
|
||||
STATIC
|
||||
UINT32
|
||||
EFIAPI
|
||||
ArrayLength (
|
||||
IN CHAR16 *String
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Determine the length of null terminated char16 array.
|
||||
|
||||
Arguments:
|
||||
|
||||
String Null-terminated CHAR16 array pointer.
|
||||
|
||||
Returns:
|
||||
|
||||
UINT32 Number of bytes in the string, including the double NULL at the end;
|
||||
|
||||
--*/
|
||||
{
|
||||
UINT32 Count;
|
||||
|
||||
if (NULL == String) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Count = 0;
|
||||
|
||||
while (0 != String[Count]) {
|
||||
Count++;
|
||||
}
|
||||
|
||||
return (Count * 2) + 2;
|
||||
}
|
||||
|
||||
STATIC
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
|
@ -600,7 +563,7 @@ Returns:
|
|||
return EFI_SUCCESS;
|
||||
} else {
|
||||
if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) {
|
||||
if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable[Index]), ArrayLength (VariableName))) {
|
||||
if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable[Index]), Variable[Index]->NameSize)) {
|
||||
PtrTrack->CurrPtr = Variable[Index];
|
||||
PtrTrack->Volatile = (BOOLEAN) Index;
|
||||
return EFI_SUCCESS;
|
||||
|
@ -876,7 +839,7 @@ Returns:
|
|||
//
|
||||
Status = EFI_WRITE_PROTECTED;
|
||||
goto Done;
|
||||
} else if (sizeof (VARIABLE_HEADER) + ArrayLength (VariableName) + DataSize > MAX_VARIABLE_SIZE) {
|
||||
} else if (sizeof (VARIABLE_HEADER) + StrSize (VariableName) + DataSize > MAX_VARIABLE_SIZE) {
|
||||
//
|
||||
// The size of the VariableName, including the Unicode Null in bytes plus
|
||||
// the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes.
|
||||
|
@ -985,7 +948,7 @@ Returns:
|
|||
//
|
||||
NextVariable->Reserved = 0;
|
||||
VarNameOffset = sizeof (VARIABLE_HEADER);
|
||||
VarNameSize = ArrayLength (VariableName);
|
||||
VarNameSize = StrSize (VariableName);
|
||||
CopyMem (
|
||||
(UINT8 *) ((UINTN) NextVariable + VarNameOffset),
|
||||
VariableName,
|
||||
|
|
|
@ -49,6 +49,9 @@
|
|||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseLib</Keyword>
|
||||
</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>Variable.h</Filename>
|
||||
|
|
|
@ -52,6 +52,9 @@
|
|||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseLib</Keyword>
|
||||
</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>Variable.h</Filename>
|
||||
|
|
Loading…
Reference in New Issue