From f7043f6281dd27b19393b3d18daa227acd9459c6 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 1 Apr 2019 12:00:09 +1030 Subject: [PATCH] PR24402, global buffer overflow in symtab_finalize PR 24402 * symtab.c (symtab_finalize): Init prev_addr to one less than first symbol address, not one more. Correct test for symbols with leading underscores. --- gprof/ChangeLog | 7 +++++++ gprof/symtab.c | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/gprof/ChangeLog b/gprof/ChangeLog index a1da7e5ad8a..9815b156127 100644 --- a/gprof/ChangeLog +++ b/gprof/ChangeLog @@ -1,3 +1,10 @@ +2019-04-01 Alan Modra + + PR 24402 + * symtab.c (symtab_finalize): Init prev_addr to one less than + first symbol address, not one more. Correct test for symbols + with leading underscores. + 2019-01-21 Nick Clifton * po/tr.po: Updated Turkish translation. diff --git a/gprof/symtab.c b/gprof/symtab.c index 740168c703b..70eb41573bc 100644 --- a/gprof/symtab.c +++ b/gprof/symtab.c @@ -89,7 +89,7 @@ symtab_finalize (Sym_Table *tab) /* Remove duplicate entries to speed-up later processing and set end_addr if its not set yet. */ - prev_addr = tab->base[0].addr + 1; + prev_addr = tab->base[0].addr - 1; for (src = dst = tab->base; src < tab->limit; ++src) { @@ -107,7 +107,7 @@ symtab_finalize (Sym_Table *tab) && ((src->is_func && !dst[-1].is_func) || ((src->is_func == dst[-1].is_func) && ((src->name[0] != '_' && dst[-1].name[0] == '_') - || (src->name[0] + || (src->name[0] == '_' && dst[-1].name[0] == '_' && src->name[1] != '_' && dst[-1].name[1] == '_')))))) { -- 2.30.2