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
template <class Fn>
const ElfPhdr* ElfFile::iterateProgramHeaders(Fn fn) const {
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;
}
}
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 {
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;
}
}
const ElfShdr* ptr = &at<ElfShdr>(elfHeader().e_shoff);
for (size_t i = 0; i < elfHeader().e_shnum; i++, ptr++) {
if (fn(*ptr)) {
return ptr;
}
}