From 1d76be0c440bd367e4d8c6b9de9ebbe70dd873fd Mon Sep 17 00:00:00 2001 From: Aaron Esau Date: Thu, 14 Oct 2021 17:06:13 -0700 Subject: [PATCH] Fix realloc being resolved as reallocarray and not getting a bp (thanks @mysterywave) --- src/debugger.c | 1 + src/handlers.c | 4 ++-- src/symbol.c | 12 ++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/debugger.c b/src/debugger.c index cc9033b..e1ed4d7 100644 --- a/src/debugger.c +++ b/src/debugger.c @@ -471,6 +471,7 @@ void start_debugger(char *chargv[]) { _add_breakpoint(child, bp_malloc); _add_breakpoint(child, bp_calloc); _add_breakpoint(child, bp_free); + _add_breakpoint(child, bp_realloc); _add_breakpoint(child, bp_reallocarray); } diff --git a/src/handlers.c b/src/handlers.c index d28f7d3..0d9ff97 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -187,7 +187,7 @@ void _pre_realloc(int _type, uint64_t iptr, uint64_t nmemb, uint64_t isize) { if (_type == 1) REALLOC_COUNT++; else if (_type == 2) REALLOCARRAY_COUNT++; uint64_t oid = get_oid(); - orig_chunk = find_chunk(ptr); + orig_chunk = alloc_chunk(ptr); log_heap("... " SYM ": %s(", oid, _name); if (orig_chunk && orig_chunk->ops[STATE_MALLOC]) { @@ -248,7 +248,7 @@ static inline void _post_realloc(int _type, uint64_t new_ptr) { if (ptr == new_ptr) { // the chunk shrank - ASSERT_NICE(orig_chunk == new_chunk, "the new/old Chunk meta are not equiv (new=" PTR_ERR ", old=" PTR_ERR ")", PTR_ARG(new_chunk), PTR_ARG(orig_chunk)); + //ASSERT_NICE(orig_chunk == new_chunk, "the new/old Chunk meta are not equiv (new=" PTR_ERR ", old=" PTR_ERR ")", PTR_ARG(new_chunk), PTR_ARG(orig_chunk)); if (new_chunk) { new_chunk->ops[STATE_MALLOC] = oid; // NOTE: we treat it as a malloc for now diff --git a/src/symbol.c b/src/symbol.c index 5e5952c..0506698 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -173,8 +173,8 @@ int lookup_symbols(char *fname, SymbolEntry **ses, char **interp_name) { int sesi = 0; while (ses[sesi]) { SymbolEntry *cse = ses[sesi++]; - if (((!cse->offset && rela_offsets[ji]) || cse->type == SE_TYPE_UNRESOLVED) && strncmp(cse->name, name, n) == 0) { - //printf("rela dyn plt: st_name: %s @ 0x%x (%d) rela idx %d\n", name, rela_offsets[ji], sym.st_shndx, ji); + if (((!cse->offset && rela_offsets[ji]) || cse->type == SE_TYPE_UNRESOLVED) && strcmp(cse->name, name) == 0) { + debug("rela dyn plt: st_name: %s @ 0x%x (%d) rela idx %d\n", name, rela_offsets[ji], sym.st_shndx, ji); cse->type = SE_TYPE_DYNAMIC; cse->offset = (uint64_t)rela_offsets[ji]; cse->section = sym.st_shndx; @@ -225,8 +225,8 @@ int lookup_symbols(char *fname, SymbolEntry **ses, char **interp_name) { int sesi = 0; while (ses[sesi]) { SymbolEntry *cse = ses[sesi++]; - if (((!cse->offset && rela_offsets[ji]) || cse->type == SE_TYPE_UNRESOLVED) && strncmp(cse->name, name, n) == 0) { - //printf("dyn plt: st_name: %s @ 0x%x (%d) rela idx %d\n", name, rela_offsets[ji], sym.st_shndx, ji); + if (((!cse->offset && rela_offsets[ji]) || cse->type == SE_TYPE_UNRESOLVED) && strcmp(cse->name, name) == 0) { + debug("dyn plt: st_name: %s @ 0x%x (%d) rela idx %d\n", name, rela_offsets[ji], sym.st_shndx, ji); cse->type = SE_TYPE_DYNAMIC_PLT; cse->offset = (uint64_t)rela_offsets[ji]; cse->section = sym.st_shndx; @@ -251,8 +251,8 @@ int lookup_symbols(char *fname, SymbolEntry **ses, char **interp_name) { int sesi = 0; while (ses[sesi]) { SymbolEntry *cse = ses[sesi++]; - if (((!cse->offset && sym.st_value) || cse->type == SE_TYPE_UNRESOLVED) && strncmp(cse->name, name, n) == 0) { - //printf("tab: st_name: %s @ 0x%x\n", name, sym.st_value); + if (((!cse->offset && sym.st_value) || cse->type == SE_TYPE_UNRESOLVED) && strcmp(cse->name, name) == 0) { + debug("tab: st_name: %s @ 0x%x\n", name, sym.st_value); cse->type = SE_TYPE_STATIC; cse->offset = (uint64_t)(sym.st_value) - load_addr; cse->section = sym.st_shndx;