Bug 1903021 - Avoid use after vector resize. a=RyanVM

Original Revision: https://phabricator.services.mozilla.com/D214330

Differential Revision: https://phabricator.services.mozilla.com/D214487
This commit is contained in:
Mike Hommey 2024-06-21 22:19:57 +00:00
parent 5af0b5d0b6
commit 7eeac8ca54

View file

@ -1116,7 +1116,7 @@ int do_relocation_section(Elf* elf, unsigned int rel_type,
// can actually use it)
if (elf->getSegmentByType(PT_GNU_RELRO)) {
ElfSection* gnu_versym = dyn->getSectionForType(DT_VERSYM);
auto lookup = [&symtab, &gnu_versym](const char* symbol) {
auto ensure_symbol = [&symtab, &gnu_versym](const char* symbol) {
Elf_SymValue* sym_value = symtab->lookup(symbol, STT(FUNC));
if (!sym_value) {
symtab->syms.emplace_back();
@ -1138,11 +1138,13 @@ int do_relocation_section(Elf* elf, unsigned int rel_type,
gnu_versym->grow(gnu_versym->getSize() + gnu_versym->getEntSize());
}
}
return sym_value;
};
Elf_SymValue* mprotect = lookup("mprotect");
Elf_SymValue* sysconf = lookup("sysconf");
// ensure_symbol may trigger a symbol table vector resize, so only lookup
// the symbols after we're done touching the symbol table.
ensure_symbol("mprotect");
ensure_symbol("sysconf");
Elf_SymValue* mprotect = symtab->lookup("mprotect", STT(FUNC));
Elf_SymValue* sysconf = symtab->lookup("sysconf", STT(FUNC));
// Add relocations for the mprotect and sysconf symbols.
auto add_relocation_to = [&new_rels, &symtab, rel_type2](