diff --git a/Source/Tools/CommonTools/Linux/Utils/ELFParser.h b/Source/Tools/CommonTools/Linux/Utils/ELFParser.h index b4d43e56d..2742b87cf 100644 --- a/Source/Tools/CommonTools/Linux/Utils/ELFParser.h +++ b/Source/Tools/CommonTools/Linux/Utils/ELFParser.h @@ -45,7 +45,9 @@ struct ELFParser { } // Reset to beginning - lseek(fd, 0, SEEK_SET); + if (lseek(fd, 0, SEEK_SET) == -1) { + return false; + } uint8_t header[5]; if (pread(fd, header, sizeof(header), 0) == -1) { @@ -146,6 +148,12 @@ struct ELFParser { return false; } + // sanity check program header offset size. + if (ehdr.e_phoff > Size || (ehdr.e_phentsize * ehdr.e_phnum) > (Size - ehdr.e_phoff)) { + LogMan::Msg::EFmt("Program headers exceeds size of program"); + return false; + } + if (type == ::ELFLoader::ELFContainer::TYPE_X86_32) { fextl::vector phdrs32(ehdr.e_phnum);