EmbeddedPkg/Library/PrePiLib/FwVol.c | 63 ++++++++++++++++---- 1 file changed, 51 insertions(+), 12 deletions(-)
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Michael Zimmermann <sigmaepsilon92@gmail.com>
---
EmbeddedPkg/Library/PrePiLib/FwVol.c | 63 ++++++++++++++++----
1 file changed, 51 insertions(+), 12 deletions(-)
diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c
b/EmbeddedPkg/Library/PrePiLib/FwVol.c
index 530fc15dc..d513de351 100644
--- a/EmbeddedPkg/Library/PrePiLib/FwVol.c
+++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c
@@ -296,35 +296,61 @@ FfsProcessSection (
UINT32 SectionLength;
UINT32 ParsedLength;
EFI_COMPRESSION_SECTION *CompressionSection;
+ EFI_COMPRESSION_SECTION2 *CompressionSection2;
UINT32 DstBufferSize;
VOID *ScratchBuffer;
UINT32 ScratchBufferSize;
VOID *DstBuffer;
UINT16 SectionAttribute;
UINT32 AuthenticationStatus;
+ CHAR8 *CompressedData;
+ UINTN CompressedDataLength;
*OutputBuffer = NULL;
ParsedLength = 0;
Status = EFI_NOT_FOUND;
while (ParsedLength < SectionSize) {
+ if (IS_SECTION2 (Section)) {
+ ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF);
+ }
+
if (Section->Type == SectionType) {
- *OutputBuffer = (VOID *)(Section + 1);
+ if (IS_SECTION2 (Section)) {
+ *OutputBuffer = (VOID *)((UINT8 *) Section + sizeof
(EFI_COMMON_SECTION_HEADER2));
+ } else {
+ *OutputBuffer = (VOID *)((UINT8 *) Section + sizeof
(EFI_COMMON_SECTION_HEADER));
+ }
return EFI_SUCCESS;
} else if ((Section->Type == EFI_SECTION_COMPRESSION) ||
(Section->Type == EFI_SECTION_GUID_DEFINED)) {
if (Section->Type == EFI_SECTION_COMPRESSION) {
- CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
- SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF;
-
- if (CompressionSection->CompressionType !=
EFI_STANDARD_COMPRESSION) {
- return EFI_UNSUPPORTED;
+ if (IS_SECTION2 (Section)) {
+ CompressionSection2 = (EFI_COMPRESSION_SECTION2 *) Section;
+ SectionLength = SECTION2_SIZE (Section);
+
+ if (CompressionSection2->CompressionType !=
EFI_STANDARD_COMPRESSION) {
+ return EFI_UNSUPPORTED;
+ }
+
+ CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section
+ 1);
+ CompressedDataLength = (UINT32) SectionLength - sizeof
(EFI_COMPRESSION_SECTION2);
+ } else {
+ CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
+ SectionLength = SECTION_SIZE (Section);
+
+ if (CompressionSection->CompressionType !=
EFI_STANDARD_COMPRESSION) {
+ return EFI_UNSUPPORTED;
+ }
+
+ CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section
+ 1);
+ CompressedDataLength = (UINT32) SectionLength - sizeof
(EFI_COMPRESSION_SECTION);
}
Status = UefiDecompressGetInfo (
- (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
- (UINT32) SectionLength - sizeof
(EFI_COMPRESSION_SECTION),
+ CompressedData,
+ CompressedDataLength,
&DstBufferSize,
&ScratchBufferSize
);
@@ -362,13 +388,23 @@ FfsProcessSection (
// DstBuffer still is one section. Adjust DstBuffer offset, skip EFI
section header
// to make section data at page alignment.
//
- DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof
(EFI_COMMON_SECTION_HEADER);
+ if (IS_SECTION2 (Section))
+ DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof
(EFI_COMMON_SECTION_HEADER2);
+ else
+ DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof
(EFI_COMMON_SECTION_HEADER);
//
// Call decompress function
//
if (Section->Type == EFI_SECTION_COMPRESSION) {
+ if (IS_SECTION2 (Section)) {
+ CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section
+ 1);
+ }
+ else {
+ CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section
+ 1);
+ }
+
Status = UefiDecompress (
- (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
+ CompressedData,
DstBuffer,
ScratchBuffer
);
@@ -397,12 +433,15 @@ FfsProcessSection (
}
}
+ if (IS_SECTION2 (Section)) {
+ SectionLength = SECTION2_SIZE (Section);
+ } else {
+ SectionLength = SECTION_SIZE (Section);
+ }
//
- // Size is 24 bits wide so mask upper 8 bits.
// SectionLength is adjusted it is 4 byte aligned.
// Go to the next section
//
- SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF;
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
ASSERT (SectionLength != 0);
ParsedLength += SectionLength;
--
2.15.1
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
On 11 December 2017 at 07:39, Michael Zimmermann <sigmaepsilon92@gmail.com> wrote: > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Michael Zimmermann <sigmaepsilon92@gmail.com> Thanks a lot for fixing this! Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > --- > EmbeddedPkg/Library/PrePiLib/FwVol.c | 63 ++++++++++++++++---- > 1 file changed, 51 insertions(+), 12 deletions(-) > > diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c > b/EmbeddedPkg/Library/PrePiLib/FwVol.c > index 530fc15dc..d513de351 100644 > --- a/EmbeddedPkg/Library/PrePiLib/FwVol.c > +++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c > @@ -296,35 +296,61 @@ FfsProcessSection ( > UINT32 SectionLength; > UINT32 ParsedLength; > EFI_COMPRESSION_SECTION *CompressionSection; > + EFI_COMPRESSION_SECTION2 *CompressionSection2; > UINT32 DstBufferSize; > VOID *ScratchBuffer; > UINT32 ScratchBufferSize; > VOID *DstBuffer; > UINT16 SectionAttribute; > UINT32 AuthenticationStatus; > + CHAR8 *CompressedData; > + UINTN CompressedDataLength; > > > *OutputBuffer = NULL; > ParsedLength = 0; > Status = EFI_NOT_FOUND; > while (ParsedLength < SectionSize) { > + if (IS_SECTION2 (Section)) { > + ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF); > + } > + > if (Section->Type == SectionType) { > - *OutputBuffer = (VOID *)(Section + 1); > + if (IS_SECTION2 (Section)) { > + *OutputBuffer = (VOID *)((UINT8 *) Section + sizeof > (EFI_COMMON_SECTION_HEADER2)); > + } else { > + *OutputBuffer = (VOID *)((UINT8 *) Section + sizeof > (EFI_COMMON_SECTION_HEADER)); > + } > > return EFI_SUCCESS; > } else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type > == EFI_SECTION_GUID_DEFINED)) { > > if (Section->Type == EFI_SECTION_COMPRESSION) { > - CompressionSection = (EFI_COMPRESSION_SECTION *) Section; > - SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF; > - > - if (CompressionSection->CompressionType != > EFI_STANDARD_COMPRESSION) { > - return EFI_UNSUPPORTED; > + if (IS_SECTION2 (Section)) { > + CompressionSection2 = (EFI_COMPRESSION_SECTION2 *) Section; > + SectionLength = SECTION2_SIZE (Section); > + > + if (CompressionSection2->CompressionType != > EFI_STANDARD_COMPRESSION) { > + return EFI_UNSUPPORTED; > + } > + > + CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section > + 1); > + CompressedDataLength = (UINT32) SectionLength - sizeof > (EFI_COMPRESSION_SECTION2); > + } else { > + CompressionSection = (EFI_COMPRESSION_SECTION *) Section; > + SectionLength = SECTION_SIZE (Section); > + > + if (CompressionSection->CompressionType != > EFI_STANDARD_COMPRESSION) { > + return EFI_UNSUPPORTED; > + } > + > + CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + > 1); > + CompressedDataLength = (UINT32) SectionLength - sizeof > (EFI_COMPRESSION_SECTION); > } > > Status = UefiDecompressGetInfo ( > - (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1), > - (UINT32) SectionLength - sizeof > (EFI_COMPRESSION_SECTION), > + CompressedData, > + CompressedDataLength, > &DstBufferSize, > &ScratchBufferSize > ); > @@ -362,13 +388,23 @@ FfsProcessSection ( > // DstBuffer still is one section. Adjust DstBuffer offset, skip EFI > section header > // to make section data at page alignment. > // > - DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof > (EFI_COMMON_SECTION_HEADER); > + if (IS_SECTION2 (Section)) > + DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof > (EFI_COMMON_SECTION_HEADER2); > + else > + DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof > (EFI_COMMON_SECTION_HEADER); > // > // Call decompress function > // > if (Section->Type == EFI_SECTION_COMPRESSION) { > + if (IS_SECTION2 (Section)) { > + CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section > + 1); > + } > + else { > + CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + > 1); > + } > + > Status = UefiDecompress ( > - (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1), > + CompressedData, > DstBuffer, > ScratchBuffer > ); > @@ -397,12 +433,15 @@ FfsProcessSection ( > } > } > > + if (IS_SECTION2 (Section)) { > + SectionLength = SECTION2_SIZE (Section); > + } else { > + SectionLength = SECTION_SIZE (Section); > + } > // > - // Size is 24 bits wide so mask upper 8 bits. > // SectionLength is adjusted it is 4 byte aligned. > // Go to the next section > // > - SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF; > SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4); > ASSERT (SectionLength != 0); > ParsedLength += SectionLength; > -- > 2.15.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
On 11 December 2017 at 18:22, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > On 11 December 2017 at 07:39, Michael Zimmermann > <sigmaepsilon92@gmail.com> wrote: >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Michael Zimmermann <sigmaepsilon92@gmail.com> > > Thanks a lot for fixing this! > > Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Could you resend the patch with git send-email please? I cannot apply it: Applying: EmbeddedPkg/PrePiLib: add support for v2 sections error: corrupt patch at line 24 Patch failed at 0001 EmbeddedPkg/PrePiLib: add support for v2 sections _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2024 Red Hat, Inc.