Commit 5d64a503 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Facebook Github Bot

Fix crashing on corrupted ELF binaries with invalid offsets in ELF header.

Summary:
There are cases where ELF binaries are running fine, but have slightly
corrupted ELF headers, e.g., with section headers offset pointing beyond boundaries
of file. I'm guessing this is due to running strip or objdump with either some
particular combination of flags or some due to buggy version of those tools. This
change prevents from crashing on such files.

Reviewed By: yfeldblum

Differential Revision: D6616027

fbshipit-source-id: 8cb3ac4475a51d1f1045c395977a6a77fbefffb2
parent 9df5dacf
......@@ -23,25 +23,37 @@ namespace symbolizer {
template <class Fn>
const ElfPhdr* ElfFile::iterateProgramHeaders(Fn fn) const {
// there exist ELF binaries which execute correctly, but have invalid internal
// offset(s) to program/section headers; most probably due to invalid
// stripping of symbols
if (elfHeader().e_phoff + sizeof(ElfPhdr) >= length_) {
return nullptr;
}
const ElfPhdr* ptr = &at<ElfPhdr>(elfHeader().e_phoff);
for (size_t i = 0; i < elfHeader().e_phnum; i++, ptr++) {
if (fn(*ptr)) {
return ptr;
}
}
return nullptr;
}
template <class Fn>
const ElfShdr* ElfFile::iterateSections(Fn fn) const {
// there exist ELF binaries which execute correctly, but have invalid internal
// offset(s) to program/section headers; most probably due to invalid
// stripping of symbols
if (elfHeader().e_shoff + sizeof(ElfShdr) >= length_) {
return nullptr;
}
const ElfShdr* ptr = &at<ElfShdr>(elfHeader().e_shoff);
for (size_t i = 0; i < elfHeader().e_shnum; i++, ptr++) {
if (fn(*ptr)) {
return ptr;
}
}
return nullptr;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment