From 81eee41edf5bef7feac94c6aff17205089cb61db Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 1 Dec 2009 09:55:33 +0000 Subject: [PATCH] Don't read() the individual program and section headers, but rather read() the respective tables at once. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34405 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/storage/ResourceFile.cpp | 34 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/kits/storage/ResourceFile.cpp b/src/kits/storage/ResourceFile.cpp index 45cab6a31c..1f19dd6ead 100644 --- a/src/kits/storage/ResourceFile.cpp +++ b/src/kits/storage/ResourceFile.cpp @@ -538,12 +538,21 @@ ResourceFile::_InitELFXFile(BFile& file, uint64 fileSize) resourceOffset = std::max(resourceOffset, programHeaderTableOffset + programHeaderTableSize); + // load the program headers into memory + uint8* programHeaders = (uint8*)malloc( + programHeaderCount * programHeaderSize); + if (programHeaders == NULL) + throw Exception(B_NO_MEMORY); + MemoryDeleter programHeadersDeleter(programHeaders); + + read_exactly(file, programHeaderTableOffset, programHeaders, + programHeaderCount * programHeaderSize, + "Failed to read ELF program headers."); + // iterate through the program headers for (uint32 i = 0; i < programHeaderCount; i++) { - uint64 shOffset = programHeaderTableOffset + i * programHeaderSize; - ElfProgramHeader programHeader; - read_exactly(file, shOffset, &programHeader, - sizeof(ElfProgramHeader), "Failed to read ELF program header."); + ElfProgramHeader& programHeader + = *(ElfProgramHeader*)(programHeaders + i * programHeaderSize); // get the header values uint32 type = _GetInt(programHeader.p_type); @@ -587,12 +596,21 @@ ResourceFile::_InitELFXFile(BFile& file, uint64 fileSize) resourceOffset = std::max(resourceOffset, sectionHeaderTableOffset + sectionHeaderTableSize); + // load the section headers into memory + uint8* sectionHeaders = (uint8*)malloc( + sectionHeaderCount * sectionHeaderSize); + if (sectionHeaders == NULL) + throw Exception(B_NO_MEMORY); + MemoryDeleter sectionHeadersDeleter(sectionHeaders); + + read_exactly(file, sectionHeaderTableOffset, sectionHeaders, + sectionHeaderCount * sectionHeaderSize, + "Failed to read ELF section headers."); + // iterate through the section headers for (uint32 i = 0; i < sectionHeaderCount; i++) { - uint32 shOffset = sectionHeaderTableOffset + i * sectionHeaderSize; - ElfSectionHeader sectionHeader; - read_exactly(file, shOffset, §ionHeader, - sizeof(ElfSectionHeader), "Failed to read ELF section header."); + ElfSectionHeader& sectionHeader + = *(ElfSectionHeader*)(sectionHeaders + i * sectionHeaderSize); // get the header values uint32 type = _GetInt(sectionHeader.sh_type);