From 75927e7bbbc81de662755cee9c2e65b975138e06 Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Tue, 16 May 2023 15:46:18 -0700 Subject: [PATCH] lookup: skip duplicate local symbol table check for files without locals If the file doesn't have local object/func symbols, any empty match will do, and duplicate matching local symbol lists aren't a problem. Fixes #1345. Reported-by: lzwycc Signed-off-by: Josh Poimboeuf --- kpatch-build/lookup.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c index 2ccc181..bd2b732 100644 --- a/kpatch-build/lookup.c +++ b/kpatch-build/lookup.c @@ -165,6 +165,25 @@ static bool locals_match(struct lookup_table *table, int idx, return true; } +static bool file_has_locals(struct symbol *file_sym, struct list_head *sym_list) +{ + struct symbol *sym = file_sym; + + list_for_each_entry_continue(sym, sym_list, list) { + if (sym->type == STT_FILE) + break; + if (sym->type != STB_LOCAL) + continue; + if (maybe_discarded_sym(sym->name)) + continue; + + if (sym->type == STT_FUNC || sym->type == STT_OBJECT) + return true; + } + + return false; +} + static void find_local_syms(struct lookup_table *table, struct symbol *file_sym, struct list_head *sym_list) { @@ -184,6 +203,14 @@ static void find_local_syms(struct lookup_table *table, struct symbol *file_sym, file_sym->name, table->objname); lookup_table_file_sym = sym; + + if (!file_has_locals(file_sym, sym_list)) { + /* + * If the file doesn't have local symbols, any empty + * match will do. Skip the duplicate check. + */ + break; + } } if (!lookup_table_file_sym)