From 60189663dbbe4c7259c1209d7d4358e4eecdc74c Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 23 Mar 2013 13:25:43 +0100 Subject: [PATCH] ELF relocation: check that sectionToModify >= 0. --- Core/ELF/ElfReader.cpp | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/Core/ELF/ElfReader.cpp b/Core/ELF/ElfReader.cpp index 9054e68d6a..ea037a40c7 100644 --- a/Core/ELF/ElfReader.cpp +++ b/Core/ELF/ElfReader.cpp @@ -294,18 +294,25 @@ bool ElfReader::LoadInto(u32 loadAddress) //We have a relocation table! int sectionToModify = s->sh_info; - if (!(sections[sectionToModify].sh_flags & SHF_ALLOC)) + if (sectionToModify >= 0) { - ERROR_LOG(LOADER,"Trying to relocate non-loaded section %s",GetSectionName(sectionToModify)); - continue; + if (!(sections[sectionToModify].sh_flags & SHF_ALLOC)) + { + ERROR_LOG(LOADER,"Trying to relocate non-loaded section %s",GetSectionName(sectionToModify)); + continue; + } + + int numRelocs = s->sh_size / sizeof(Elf32_Rel); + + Elf32_Rel *rels = (Elf32_Rel *)GetSectionDataPtr(i); + + DEBUG_LOG(LOADER,"%s: Performing %i relocations on %s",name,numRelocs,GetSectionName(sectionToModify)); + LoadRelocations(rels, numRelocs); + } + else + { + WARN_LOG(LOADER, "sectionToModify = %i - ignoring PSP relocation sector %i", sectionToModify, i); } - - int numRelocs = s->sh_size / sizeof(Elf32_Rel); - - Elf32_Rel *rels = (Elf32_Rel *)GetSectionDataPtr(i); - - DEBUG_LOG(LOADER,"%s: Performing %i relocations on %s",name,numRelocs,GetSectionName(sectionToModify)); - LoadRelocations(rels, numRelocs); } else if (s->sh_type == SHT_REL) { @@ -318,10 +325,17 @@ bool ElfReader::LoadInto(u32 loadAddress) { //We have a relocation table! int sectionToModify = s->sh_info; - if (!(sections[sectionToModify].sh_flags & SHF_ALLOC)) + if (sectionToModify >= 0) { - ERROR_LOG(LOADER,"Trying to relocate non-loaded section %s, ignoring",GetSectionName(sectionToModify)); - continue; + if (!(sections[sectionToModify].sh_flags & SHF_ALLOC)) + { + ERROR_LOG(LOADER,"Trying to relocate non-loaded section %s, ignoring",GetSectionName(sectionToModify)); + continue; + } + } + else + { + WARN_LOG(LOADER, "sectionToModify = %i - ignoring relocation sector %i", sectionToModify, i); } ERROR_LOG(LOADER,"Traditional relocations unsupported."); }