[COFF] Add a bounds checking helper for iterating a coff_resource_dir_table

Instead of blindly incrementing pointers in llvm-readobj, use this
helper, which does bounds checking against the available section
data.

Differential Revision: https://reviews.llvm.org/D66818

llvm-svn: 370310
This commit is contained in:
Martin Storsjo
2019-08-29 08:59:56 +00:00
parent 357a40ec7c
commit edb6ab9ba6
3 changed files with 28 additions and 16 deletions

View File

@@ -1696,6 +1696,17 @@ ResourceSectionRef::getTableAtOffset(uint32_t Offset) {
return *Table;
}
Expected<const coff_resource_dir_entry &>
ResourceSectionRef::getTableEntryAtOffset(uint32_t Offset) {
const coff_resource_dir_entry *Entry = nullptr;
BinaryStreamReader Reader(BBS);
Reader.setOffset(Offset);
RETURN_IF_ERROR(Reader.readObject(Entry));
assert(Entry != nullptr);
return *Entry;
}
Expected<const coff_resource_dir_table &>
ResourceSectionRef::getEntrySubDir(const coff_resource_dir_entry &Entry) {
return getTableAtOffset(Entry.Offset.value());
@@ -1704,3 +1715,14 @@ ResourceSectionRef::getEntrySubDir(const coff_resource_dir_entry &Entry) {
Expected<const coff_resource_dir_table &> ResourceSectionRef::getBaseTable() {
return getTableAtOffset(0);
}
Expected<const coff_resource_dir_entry &>
ResourceSectionRef::getTableEntry(const coff_resource_dir_table &Table,
uint32_t Index) {
if (Index >= (uint32_t)(Table.NumberOfNameEntries + Table.NumberOfIDEntries))
return createStringError(object_error::parse_failed, "index out of range");
const uint8_t *TablePtr = reinterpret_cast<const uint8_t *>(&Table);
ptrdiff_t TableOffset = TablePtr - BBS.data().data();
return getTableEntryAtOffset(TableOffset + sizeof(Table) +
Index * sizeof(coff_resource_dir_entry));
}