Commit a28ff3c4 authored by Jessica Yu's avatar Jessica Yu Committed by Kleber Sacilotto de Souza

module: exclude SHN_UNDEF symbols from kallsyms api

BugLink: https://bugs.launchpad.net/bugs/1798770

[ Upstream commit 9f2d1e68 ]

Livepatch modules are special in that we preserve their entire symbol
tables in order to be able to apply relocations after module load. The
unwanted side effect of this is that undefined (SHN_UNDEF) symbols of
livepatch modules are accessible via the kallsyms api and this can
confuse symbol resolution in livepatch (klp_find_object_symbol()) and
cause subtle bugs in livepatch.

Have the module kallsyms api skip over SHN_UNDEF symbols. These symbols
are usually not available for normal modules anyway as we cut down their
symbol tables to just the core (non-undefined) symbols, so this should
really just affect livepatch modules. Note that this patch doesn't
affect the display of undefined symbols in /proc/kallsyms.
Reported-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Tested-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Reviewed-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: default avatarJessica Yu <jeyu@kernel.org>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent 2bc31c38
...@@ -3839,7 +3839,7 @@ static unsigned long mod_find_symname(struct module *mod, const char *name) ...@@ -3839,7 +3839,7 @@ static unsigned long mod_find_symname(struct module *mod, const char *name)
for (i = 0; i < kallsyms->num_symtab; i++) for (i = 0; i < kallsyms->num_symtab; i++)
if (strcmp(name, symname(kallsyms, i)) == 0 && if (strcmp(name, symname(kallsyms, i)) == 0 &&
kallsyms->symtab[i].st_info != 'U') kallsyms->symtab[i].st_shndx != SHN_UNDEF)
return kallsyms->symtab[i].st_value; return kallsyms->symtab[i].st_value;
return 0; return 0;
} }
...@@ -3885,6 +3885,10 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, ...@@ -3885,6 +3885,10 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
if (mod->state == MODULE_STATE_UNFORMED) if (mod->state == MODULE_STATE_UNFORMED)
continue; continue;
for (i = 0; i < kallsyms->num_symtab; i++) { for (i = 0; i < kallsyms->num_symtab; i++) {
if (kallsyms->symtab[i].st_shndx == SHN_UNDEF)
continue;
ret = fn(data, symname(kallsyms, i), ret = fn(data, symname(kallsyms, i),
mod, kallsyms->symtab[i].st_value); mod, kallsyms->symtab[i].st_value);
if (ret != 0) if (ret != 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment