mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-13 16:54:23 +02:00
ShellPkg: Fix Optional Data rewriting with bcfg
When modifying the Optional Data of a boot option with bcfg boot -opt the result was corrupted data, for instance a concatenation of old data, heap contents, and new data. This was due to a erronous calculation of the original optional data length. In addition to fixing the calculation, add explaining comments and introduce a helper variable, to not abuse other variables and confuse readers (including the author). Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
This commit is contained in:
parent
b21cf3bd5b
commit
54469a6918
@ -99,6 +99,7 @@ UpdateOptionalData (
|
|||||||
UINT8 *OriginalData;
|
UINT8 *OriginalData;
|
||||||
UINTN NewSize;
|
UINTN NewSize;
|
||||||
UINT8 *NewData;
|
UINT8 *NewData;
|
||||||
|
UINTN TmpSize;
|
||||||
UINTN OriginalOptionDataSize;
|
UINTN OriginalOptionDataSize;
|
||||||
|
|
||||||
UnicodeSPrint (VariableName, sizeof (VariableName), L"%s%04x", Target == BcfgTargetBootOrder ? L"Boot" : L"Driver", Index);
|
UnicodeSPrint (VariableName, sizeof (VariableName), L"%s%04x", Target == BcfgTargetBootOrder ? L"Boot" : L"Driver", Index);
|
||||||
@ -135,9 +136,12 @@ UpdateOptionalData (
|
|||||||
// Allocate new struct and discard old optional data.
|
// Allocate new struct and discard old optional data.
|
||||||
//
|
//
|
||||||
ASSERT (OriginalData != NULL);
|
ASSERT (OriginalData != NULL);
|
||||||
OriginalOptionDataSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (((CHAR16 *)(OriginalData + sizeof (UINT32) + sizeof (UINT16))));
|
// Length of Attributes, FilePathListLength, Description fields
|
||||||
OriginalOptionDataSize += (*(UINT16 *)(OriginalData + sizeof (UINT32)));
|
TmpSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (((CHAR16 *)(OriginalData + sizeof (UINT32) + sizeof (UINT16))));
|
||||||
OriginalOptionDataSize -= OriginalSize;
|
// Length of FilePathList field
|
||||||
|
TmpSize += (*(UINT16 *)(OriginalData + sizeof (UINT32)));
|
||||||
|
// What remains is the original OptionalData field
|
||||||
|
OriginalOptionDataSize = OriginalSize - TmpSize;
|
||||||
NewSize = OriginalSize - OriginalOptionDataSize + DataSize;
|
NewSize = OriginalSize - OriginalOptionDataSize + DataSize;
|
||||||
NewData = AllocatePool (NewSize);
|
NewData = AllocatePool (NewSize);
|
||||||
if (NewData == NULL) {
|
if (NewData == NULL) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user