summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@linaro.org>2018-02-11 18:42:12 +0800
committerHaojian Zhuang <haojian.zhuang@linaro.org>2018-02-11 19:21:56 +0800
commit425a1820ddc910193b1feb35e4a2acaea5054c31 (patch)
treed4d9166ac503730e99a0b8282d9310f23ab8c123
parentfeefaa5a352e27cc3f56195f19b034f12b0d6767 (diff)
downloadedk2-425a1820ddc910193b1feb35e4a2acaea5054c31.tar.gz
EmbeddedPkg/AndroidFastbootApp: fix overflow on fill buf
Fix overflow on fill buffer. Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
-rw-r--r--EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
index 849553630..564965685 100644
--- a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
+++ b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
@@ -180,7 +180,7 @@ FlashSparseImage (
)
{
EFI_STATUS Status = EFI_SUCCESS;
- UINTN Chunk, Offset = 0, Index;
+ UINTN Chunk, Offset = 0, Left, Count;
VOID *Image;
CHUNK_HEADER *ChunkHeader;
UINT32 FillBuf[FILL_BUF_SIZE];
@@ -209,20 +209,27 @@ FlashSparseImage (
Offset += ChunkHeader->ChunkSize * SparseHeader->BlockSize;
break;
case CHUNK_TYPE_FILL:
- SetMem32 (FillBuf, FILL_BUF_SIZE * sizeof (UINT32), *(UINT32 *)Image);
- Image += sizeof (UINT32);
- for (Index = 0; Index < ChunkHeader->ChunkSize; Index++) {
+ Left = ChunkHeader->ChunkSize * SparseHeader->BlockSize;
+ while (Left > 0) {
+ if (Left > FILL_BUF_SIZE * sizeof (UINT32)) {
+ Count = FILL_BUF_SIZE * sizeof (UINT32);
+ } else {
+ Count = Left;
+ }
+ SetMem32 (FillBuf, Count, *(UINT32 *)Image);
Status = mPlatform->FlashPartitionEx (
PartitionName,
Offset,
- SparseHeader->BlockSize,
+ Count,
FillBuf
);
if (EFI_ERROR (Status)) {
return Status;
}
- Offset += SparseHeader->BlockSize;
+ Offset += Count;
+ Left = Left - Count;
}
+ Image += sizeof (UINT32);
break;
case CHUNK_TYPE_DONT_CARE:
Offset += ChunkHeader->ChunkSize * SparseHeader->BlockSize;