diff options
Diffstat (limited to 'backends/plugins')
-rw-r--r-- | backends/plugins/elf/elf-loader.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/backends/plugins/elf/elf-loader.cpp b/backends/plugins/elf/elf-loader.cpp index 17a67f4d02..24a4fda703 100644 --- a/backends/plugins/elf/elf-loader.cpp +++ b/backends/plugins/elf/elf-loader.cpp @@ -320,24 +320,30 @@ bool DLObject::load() { return false; } - Common::ScopedPtrC<Elf32_Shdr> shdr(loadSectionHeaders(&ehdr)); + Elf32_Shdr *shdr = loadSectionHeaders(&ehdr); if (!shdr) return false; _symtab_sect = loadSymbolTable(&ehdr, shdr); - if (_symtab_sect < 0) + if (_symtab_sect < 0) { + free(shdr); return false; + } - if (!loadStringTable(shdr)) + if (!loadStringTable(shdr)) { + free(shdr); return false; + } // Offset by our segment allocated address // must use _segmentVMA here for multiple segments (MIPS) _segmentOffset = ptrdiff_t(_segment) - _segmentVMA; relocateSymbols(_segmentOffset); - if (!relocateRels(&ehdr, shdr)) + if (!relocateRels(&ehdr, shdr)) { + free(shdr); return false; + } return true; } |