Skip to content

Commit faee714

Browse files
committed
Add more checks to prevent a minor buffer overflow in FTW store parser
1 parent 0a6c52a commit faee714

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

common/nvramparser.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -700,13 +700,17 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index,const UINT32
700700
goto not_ftw;
701701
}
702702
// Determine store size
703-
UINT32 storeSize;
703+
UINT64 storeSize;
704704
if (storeHeader->WriteQueueSize % 0x10 == 4) {
705705
storeSize = sizeof(EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER32) + storeHeader->WriteQueueSize;
706706
}
707707
else if (storeHeader->WriteQueueSize % 0x10 == 0) {
708+
if (volumeBodySize - storeOffset < sizeof(EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER64)) {
709+
// No need to parse further, the rest of the volume is too small
710+
goto not_ftw;
711+
}
708712
const EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER64* storeHeader64 = (const EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER64*)(volumeBody.constData() + storeOffset);
709-
storeSize = (UINT32)(sizeof(EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER64) + storeHeader64->WriteQueueSize);
713+
storeSize = sizeof(EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER64) + storeHeader64->WriteQueueSize;
710714
}
711715
else {
712716
// No need to parse further, unknown FTW store size
@@ -753,7 +757,7 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index,const UINT32
753757
}
754758

755759
// Construct body
756-
body = volumeBody.mid(storeOffset + header.size(), storeSize - header.size());
760+
body = volumeBody.mid(storeOffset + header.size(), (UINT32)storeSize - header.size());
757761

758762
// Add info
759763
name = UString("FTW store");

0 commit comments

Comments
 (0)