On Mon, 2019-03-11 at 16:08 +0800, Eric Jin wrote: > The test case does not handle properly when > the 'EraseLengthGranularity' field of an Erase > Block Protocol instance is 1(SD device). > The Size parameter will underflow and become a > very large value, cause to exceed the last LBA. > The fix considers this case. > Please add a comment in the commit log to indicate there are whitepace changes in the patch as part of the cleanup, not just the above case.
With that, Acked-by: Supreeth Venkatesh <supreeth.venkat...@arm.com> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Eric Jin <eric....@intel.com> > --- > uefi- > sct/SctPkg/TestCase/UEFI/EFI/Protocol/EraseBlock/BlackBoxTest/EraseBl > ockBBTestFunction.c | 208 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++--------------------------------- > ------------------------------------------------------------------- > --- > 1 file changed, 105 insertions(+), 103 deletions(-) > > diff --git a/uefi- > sct/SctPkg/TestCase/UEFI/EFI/Protocol/EraseBlock/BlackBoxTest/EraseBl > ockBBTestFunction.c b/uefi- > sct/SctPkg/TestCase/UEFI/EFI/Protocol/EraseBlock/BlackBoxTest/EraseBl > ockBBTestFunction.c > index bc16a4738b4f..cbf43e1d59d7 100644 > --- a/uefi- > sct/SctPkg/TestCase/UEFI/EFI/Protocol/EraseBlock/BlackBoxTest/EraseBl > ockBBTestFunction.c > +++ b/uefi- > sct/SctPkg/TestCase/UEFI/EFI/Protocol/EraseBlock/BlackBoxTest/EraseBl > ockBBTestFunction.c > @@ -1,7 +1,7 @@ > /** @file > > Copyright 2017 Unified EFI, Inc.<BR> > - Copyright (c) 2017 - 2018, Intel Corporation. All rights > reserved.<BR> > + Copyright (c) 2017 - 2019, Intel Corporation. All rights > reserved.<BR> > > This program and the accompanying materials > are licensed and made available under the terms and conditions of > the BSD License > @@ -128,8 +128,8 @@ BBTestEraseBlocksFunctionTest ( > // allocate aligned buffer > // > Buffer1 = AllocateAlignedPool( > - EfiBootServicesData, > - BufferSize, > + EfiBootServicesData, > + BufferSize, Whitespace change? > IoAlign > ); > if (Buffer1 == NULL) { > @@ -147,8 +147,8 @@ BBTestEraseBlocksFunctionTest ( > } > > Buffer2 = AllocateAlignedPool( > - EfiBootServicesData, > - BufferSize, > + EfiBootServicesData, > + BufferSize, Whitespace change? > IoAlign > ); > if (Buffer2 == NULL) { > @@ -166,7 +166,7 @@ BBTestEraseBlocksFunctionTest ( > return EFI_OUT_OF_RESOURCES; > } > > - if ((MediaPresent == TRUE) && (ReadOnly == FALSE) && (LastBlock > != 0)) { > + if ((MediaPresent == TRUE) && (ReadOnly == FALSE) && (LastBlock > != 0)) { Whitesapce change? > // > // Read the data at first with ReadBlocks > // > @@ -189,10 +189,10 @@ BBTestEraseBlocksFunctionTest ( > } > > // > - // Write 1 > + // Write 1 White Space change? > // > for (Index1 = 0; Index1 < BufferSize; Index1++) { > - Buffer2[Index1] = 1; > + Buffer2[Index1] = 1; > } > > Status = BlockIo->WriteBlocks (BlockIo, MediaId, Lba, > BufferSize, (VOID*)Buffer2); > @@ -211,57 +211,59 @@ BBTestEraseBlocksFunctionTest ( > FreeAlignedPool(Buffer1); > FreeAlignedPool(Buffer2); > goto BlockIo2; > - } > + } > > // Erase Blocks with non-EraseLengthGranularity blocks > - Token.Event = NULL; > - Token.TransactionStatus = EFI_NOT_READY; > - EraseStatus = EraseBlock->EraseBlocks (EraseBlock, MediaId, > Lba+1, &Token, BufferSize - 2 * BlockSize); > - > - // Read the data with 0, the first/last block should not be > erased > - ReadStatus = BlockIo->ReadBlocks (BlockIo, MediaId, Lba, > BufferSize, (VOID*)Buffer2); > - if (ReadStatus == EFI_SUCCESS) { > - for (Index1 = 0; Index1 < BlockSize; Index1++) { > - if (Buffer2[Index1] != 0) { > - IsZero1 = FALSE; > - break; > + if (BufferSize > 2 * BlockSize) { > + Token.Event = NULL; > + Token.TransactionStatus = EFI_NOT_READY; > + > + EraseStatus = EraseBlock->EraseBlocks (EraseBlock, MediaId, > Lba+1, &Token, BufferSize - 2 * BlockSize); > + > + // Read the data with 0, the first/last block should not be > erased > + ReadStatus = BlockIo->ReadBlocks (BlockIo, MediaId, Lba, > BufferSize, (VOID*)Buffer2); > + if (ReadStatus == EFI_SUCCESS) { > + for (Index1 = 0; Index1 < BlockSize; Index1++) { > + if (Buffer2[Index1] != 0) { > + IsZero1 = FALSE; > + break; > + } > } > - } > > - for (Index1 = BlockSize; Index1 < BufferSize - BlockSize; > Index1++) { > - if (Buffer2[Index1] != 0) { > - IsZero2 = FALSE; > - break; > + for (Index1 = BlockSize; Index1 < BufferSize - BlockSize; > Index1++) { > + if (Buffer2[Index1] != 0) { > + IsZero2 = FALSE; > + break; > + } > } > - } > > - for (Index1 = BufferSize - BlockSize; Index1 < BufferSize; > Index1++) { > - if (Buffer2[Index1] != 0) { > - IsZero3 = FALSE; > - break; > + for (Index1 = BufferSize - BlockSize; Index1 < BufferSize; > Index1++) { > + if (Buffer2[Index1] != 0) { > + IsZero3 = FALSE; > + break; > + } > } > - } > > - if ((EraseStatus == EFI_SUCCESS) && (IsZero1 == FALSE) && > (IsZero2 == TRUE) && ((IsZero3 == FALSE))) > - AssertionType = EFI_TEST_ASSERTION_PASSED; > - else > - AssertionType = EFI_TEST_ASSERTION_FAILED; > - > - > - StandardLib->RecordAssertion ( > - StandardLib, > - AssertionType, > - gEraseBlockBBTestFunctionAssertionGuid003, > - L"EraseBlocks - EraseBlocks for testing, the > first/last block should not be erased", > - L"%a:%d:EraseBlocks Status - %r, IsZero1 - > %d, IsZero2 - %d, IsZero3 - %d", > - __FILE__, > - (UINTN)__LINE__, > - Status, > - IsZero1, IsZero2, IsZero3 > - ); > + if ((EraseStatus == EFI_SUCCESS) && (IsZero1 == FALSE) && > (IsZero2 == TRUE) && ((IsZero3 == FALSE))) > + AssertionType = EFI_TEST_ASSERTION_PASSED; > + else > + AssertionType = EFI_TEST_ASSERTION_FAILED; > + > > + StandardLib->RecordAssertion ( > + StandardLib, > + AssertionType, > + gEraseBlockBBTestFunctionAssertionGuid003, > + L"EraseBlocks - EraseBlocks for testing, > the first/last block should not be erased", > + L"%a:%d:EraseBlocks Status - %r, IsZero1 - > %d, IsZero2 - %d, IsZero3 - %d", > + __FILE__, > + (UINTN)__LINE__, > + EraseStatus, > + IsZero1, IsZero2, IsZero3 > + ); > + > + } > } > - > // > // Erase Blocks with the EraseLengthGranularity blocks > // > @@ -283,7 +285,7 @@ BBTestEraseBlocksFunctionTest ( > } > > if ((EraseStatus == EFI_SUCCESS) && (IsZero == TRUE)) > - AssertionType = EFI_TEST_ASSERTION_PASSED; > + AssertionType = EFI_TEST_ASSERTION_PASSED; > else > AssertionType = EFI_TEST_ASSERTION_FAILED; > > @@ -297,7 +299,7 @@ BBTestEraseBlocksFunctionTest ( > (UINTN)__LINE__, > Status, > IsZero > - ); > + ); > > > } > @@ -305,7 +307,7 @@ BBTestEraseBlocksFunctionTest ( > // > // Restore the data with WriteBlocks and FlushBlocks > // > - WriteStatus = BlockIo->WriteBlocks (BlockIo, MediaId, Lba, > BufferSize, (VOID*)Buffer1); > + WriteStatus = BlockIo->WriteBlocks (BlockIo, MediaId, Lba, > BufferSize, (VOID*)Buffer1); > FlushStatus = EFI_SUCCESS; > if (WriteCaching == TRUE) > FlushStatus = BlockIo->FlushBlocks(BlockIo); > @@ -325,8 +327,8 @@ BBTestEraseBlocksFunctionTest ( > > FreeAlignedPool(Buffer1); > FreeAlignedPool(Buffer2); > - } > - } > + } > + } > > BlockIo2: > > @@ -361,8 +363,8 @@ BlockIo2: > // allocate aligned buffer > // > Buffer1 = AllocateAlignedPool( > - EfiBootServicesData, > - BufferSize, > + EfiBootServicesData, > + BufferSize, > IoAlign > ); > if (Buffer1 == NULL) { > @@ -380,8 +382,8 @@ BlockIo2: > } > > Buffer2 = AllocateAlignedPool( > - EfiBootServicesData, > - BufferSize, > + EfiBootServicesData, > + BufferSize, > IoAlign > ); > if (Buffer2 == NULL) { > @@ -399,7 +401,7 @@ BlockIo2: > return EFI_OUT_OF_RESOURCES; > } > > - if ((MediaPresent == TRUE) && (ReadOnly == FALSE) && (LastBlock > != 0)) { > + if ((MediaPresent == TRUE) && (ReadOnly == FALSE) && (LastBlock > != 0)) { > BlockIo2Token.Event = NULL; > BlockIo2Token.TransactionStatus = EFI_NOT_READY; > > @@ -453,13 +455,13 @@ BlockIo2: > // > // Erase Blocks with non EraseLengthGranularity blocks > // > + if (BufferSize > 2 * BlockSize) { > + Token.Event = NULL; > + Token.TransactionStatus = EFI_NOT_READY; > > - Token.Event = NULL; > - Token.TransactionStatus = EFI_NOT_READY; > + EnterEvent = 0; > > - EnterEvent = 0; > - > - Status = gtBS->CreateEvent ( > + Status = gtBS->CreateEvent ( > EVT_NOTIFY_SIGNAL, > TPL_CALLBACK, > (EFI_EVENT_NOTIFY) NotifyFunction, > @@ -467,8 +469,8 @@ BlockIo2: > &Token.Event > ); > > - if (EFI_ERROR (Status)) { > - StandardLib->RecordAssertion ( > + if (EFI_ERROR (Status)) { > + StandardLib->RecordAssertion ( > StandardLib, > EFI_TEST_ASSERTION_FAILED, > gTestGenericFailureGuid, > @@ -478,46 +480,46 @@ BlockIo2: > (UINTN)__LINE__, > Status > ); > - FreeAlignedPool(Buffer1); > - FreeAlignedPool(Buffer2); > - goto End; > - } > - > - EraseStatus = EraseBlock->EraseBlocks (EraseBlock, MediaId, > Lba+1, &Token, BufferSize - 2 * BlockSize); > - > - while(Token.TransactionStatus == EFI_NOT_READY); > - > - // Read the data with 0, the first/last block should not be > erased > - ReadStatus = BlockIo2->ReadBlocksEx (BlockIo2, MediaId, Lba, > &BlockIo2Token, BufferSize, (VOID*)Buffer2); > - if (ReadStatus == EFI_SUCCESS) { > - for (Index1 = 0; Index1 < BlockSize; Index1++) { > - if (Buffer2[Index1] != 0) { > - IsZero1 = FALSE; > - break; > - } > + FreeAlignedPool(Buffer1); > + FreeAlignedPool(Buffer2); > + goto End; > } > > - for (Index1 = BlockSize; Index1 < BufferSize - BlockSize; > Index1++) { > - if (Buffer2[Index1] != 0) { > - IsZero2 = FALSE; > - break; > + EraseStatus = EraseBlock->EraseBlocks (EraseBlock, MediaId, > Lba+1, &Token, BufferSize - 2 * BlockSize); > + > + while(Token.TransactionStatus == EFI_NOT_READY); > + > + // Read the data with 0, the first/last block should not be > erased > + ReadStatus = BlockIo2->ReadBlocksEx (BlockIo2, MediaId, Lba, > &BlockIo2Token, BufferSize, (VOID*)Buffer2); > + if (ReadStatus == EFI_SUCCESS) { > + for (Index1 = 0; Index1 < BlockSize; Index1++) { > + if (Buffer2[Index1] != 0) { > + IsZero1 = FALSE; > + break; > + } > } > - } > > - for (Index1 = BufferSize - BlockSize; Index1 < BufferSize; > Index1++) { > - if (Buffer2[Index1] != 0) { > - IsZero3 = FALSE; > - break; > + for (Index1 = BlockSize; Index1 < BufferSize - BlockSize; > Index1++) { > + if (Buffer2[Index1] != 0) { > + IsZero2 = FALSE; > + break; > + } > } > - } > > - if ((EraseStatus == EFI_SUCCESS) && (IsZero1 == FALSE) && > (IsZero2 == TRUE) && ((IsZero3 == FALSE))) > - AssertionType = EFI_TEST_ASSERTION_PASSED; > - else > - AssertionType = EFI_TEST_ASSERTION_FAILED; > + for (Index1 = BufferSize - BlockSize; Index1 < BufferSize; > Index1++) { > + if (Buffer2[Index1] != 0) { > + IsZero3 = FALSE; > + break; > + } > + } > + > + if ((EraseStatus == EFI_SUCCESS) && (IsZero1 == FALSE) && > (IsZero2 == TRUE) && ((IsZero3 == FALSE))) > + AssertionType = EFI_TEST_ASSERTION_PASSED; > + else > + AssertionType = EFI_TEST_ASSERTION_FAILED; > + > > - > - StandardLib->RecordAssertion ( > + StandardLib->RecordAssertion ( > StandardLib, > AssertionType, > gEraseBlockBBTestFunctionAssertionGuid004, > @@ -525,12 +527,12 @@ BlockIo2: > L"%a:%d:EraseBlocks Status - %r, IsZero1 - > %d, IsZero2 - %d, IsZero3 - %d", > __FILE__, > (UINTN)__LINE__, > - Status, > + EraseStatus, > IsZero1, IsZero2, IsZero3 > ); > > + } > } > - > // > // Erase Blocks with the EraseLengthGranularity blocks > // > @@ -580,7 +582,7 @@ BlockIo2: > } > > if ((EraseStatus == EFI_SUCCESS) && (IsZero == TRUE) && > (EnterEvent == 1)) > - AssertionType = EFI_TEST_ASSERTION_PASSED; > + AssertionType = EFI_TEST_ASSERTION_PASSED; > else > AssertionType = EFI_TEST_ASSERTION_FAILED; > > @@ -605,7 +607,7 @@ BlockIo2: > WriteStatus = BlockIo2->WriteBlocksEx (BlockIo2, MediaId, Lba, > &BlockIo2Token, BufferSize, (VOID*)Buffer1); > FlushStatus = EFI_SUCCESS; > if (WriteCaching == TRUE) > - FlushStatus = BlockIo2->FlushBlocksEx (BlockIo2, > &BlockIo2Token); > + FlushStatus = BlockIo2->FlushBlocksEx (BlockIo2, > &BlockIo2Token); > > if ((WriteStatus != EFI_SUCCESS) || (FlushStatus != > EFI_SUCCESS)) > StandardLib->RecordAssertion ( _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel