mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
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
|
STATIC
|
||||||
UINT8 *
|
UINT8 *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
@ -269,7 +231,7 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) {
|
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->CurrPtr = Variable[Index];
|
||||||
PtrTrack->Volatile = (BOOLEAN) Index;
|
PtrTrack->Volatile = (BOOLEAN) Index;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -529,7 +491,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
Status = EFI_WRITE_PROTECTED;
|
Status = EFI_WRITE_PROTECTED;
|
||||||
goto Done;
|
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 size of the VariableName, including the Unicode Null in bytes plus
|
||||||
// the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes.
|
// 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.
|
// Create a new variable and copy the data.
|
||||||
//
|
//
|
||||||
VarNameOffset = sizeof (VARIABLE_HEADER);
|
VarNameOffset = sizeof (VARIABLE_HEADER);
|
||||||
VarNameSize = ArrayLength (VariableName);
|
VarNameSize = StrSize (VariableName);
|
||||||
VarDataOffset = VarNameOffset + VarNameSize + GET_PAD_SIZE (VarNameSize);
|
VarDataOffset = VarNameOffset + VarNameSize + GET_PAD_SIZE (VarNameSize);
|
||||||
VarSize = VarDataOffset + DataSize + GET_PAD_SIZE (DataSize);
|
VarSize = VarDataOffset + DataSize + GET_PAD_SIZE (DataSize);
|
||||||
|
|
||||||
|
@ -43,6 +43,9 @@
|
|||||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
<Keyword>UefiLib</Keyword>
|
<Keyword>UefiLib</Keyword>
|
||||||
</LibraryClass>
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
</LibraryClassDefinitions>
|
</LibraryClassDefinitions>
|
||||||
<SourceFiles>
|
<SourceFiles>
|
||||||
<Filename>Variable.h</Filename>
|
<Filename>Variable.h</Filename>
|
||||||
|
@ -46,6 +46,9 @@
|
|||||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
<Keyword>UefiLib</Keyword>
|
<Keyword>UefiLib</Keyword>
|
||||||
</LibraryClass>
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
</LibraryClassDefinitions>
|
</LibraryClassDefinitions>
|
||||||
<SourceFiles>
|
<SourceFiles>
|
||||||
<Filename>Variable.h</Filename>
|
<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
|
All rights reserved. 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
|
||||||
@ -209,7 +209,7 @@ Returns:
|
|||||||
(((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&
|
(((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&
|
||||||
(((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])
|
(((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;
|
PtrTrack->CurrPtr = Variable;
|
||||||
return EFI_SUCCESS;
|
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">
|
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<MsaHeader>
|
<MsaHeader>
|
||||||
<ModuleName>PeiVariable</ModuleName>
|
<ModuleName>PeiVariable</ModuleName>
|
||||||
@ -37,6 +37,9 @@
|
|||||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
<Keyword>PcdLib</Keyword>
|
<Keyword>PcdLib</Keyword>
|
||||||
</LibraryClass>
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseMemoryLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
</LibraryClassDefinitions>
|
</LibraryClassDefinitions>
|
||||||
<SourceFiles>
|
<SourceFiles>
|
||||||
<Filename>Variable.h</Filename>
|
<Filename>Variable.h</Filename>
|
||||||
|
@ -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
|
STATIC
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
@ -600,7 +563,7 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
if (CompareGuid (VendorGuid, &Variable[Index]->VendorGuid)) {
|
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->CurrPtr = Variable[Index];
|
||||||
PtrTrack->Volatile = (BOOLEAN) Index;
|
PtrTrack->Volatile = (BOOLEAN) Index;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -876,7 +839,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
Status = EFI_WRITE_PROTECTED;
|
Status = EFI_WRITE_PROTECTED;
|
||||||
goto Done;
|
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 size of the VariableName, including the Unicode Null in bytes plus
|
||||||
// the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes.
|
// the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes.
|
||||||
@ -985,7 +948,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
NextVariable->Reserved = 0;
|
NextVariable->Reserved = 0;
|
||||||
VarNameOffset = sizeof (VARIABLE_HEADER);
|
VarNameOffset = sizeof (VARIABLE_HEADER);
|
||||||
VarNameSize = ArrayLength (VariableName);
|
VarNameSize = StrSize (VariableName);
|
||||||
CopyMem (
|
CopyMem (
|
||||||
(UINT8 *) ((UINTN) NextVariable + VarNameOffset),
|
(UINT8 *) ((UINTN) NextVariable + VarNameOffset),
|
||||||
VariableName,
|
VariableName,
|
||||||
|
@ -49,6 +49,9 @@
|
|||||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
<Keyword>UefiLib</Keyword>
|
<Keyword>UefiLib</Keyword>
|
||||||
</LibraryClass>
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
</LibraryClassDefinitions>
|
</LibraryClassDefinitions>
|
||||||
<SourceFiles>
|
<SourceFiles>
|
||||||
<Filename>Variable.h</Filename>
|
<Filename>Variable.h</Filename>
|
||||||
|
@ -52,6 +52,9 @@
|
|||||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
<Keyword>UefiLib</Keyword>
|
<Keyword>UefiLib</Keyword>
|
||||||
</LibraryClass>
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
</LibraryClassDefinitions>
|
</LibraryClassDefinitions>
|
||||||
<SourceFiles>
|
<SourceFiles>
|
||||||
<Filename>Variable.h</Filename>
|
<Filename>Variable.h</Filename>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user