Skip to content

Commit f9fb44b

Browse files
committed
objtool/klp: Fix detection of corrupt static branch/call entries
Patching a function which references a static key living in a kernel module is unsupported due to ordering issues inherent to late module patching: 1) Load a livepatch module which has a __jump_table entry which needs a klp reloc to reference static key K which lives in module M. 2) The __jump_table klp reloc does *not* get resolved because module M is not yet loaded. 3) jump_label_add_module() corrupts memory (or causes a panic) when dereferencing the uninitialized pointer to key K. validate_special_section_klp_reloc() intends to prevent that from ever happening by catching it at build time. However, it incorrectly assumes the special section entry's reloc symbol references have already been converted from section symbols to object symbols, causing the validation to miss corruption in extracted static branch/call table entries. Make sure the references have been properly converted before doing the validation. Fixes: dd590d4 ("objtool/klp: Introduce klp diff subcommand for diffing object files") Reported-by: Song Liu <song@kernel.org> Reviewed-and-tested-by: Song Liu <song@kernel.org> Link: https://patch.msgid.link/124ad747b751df0df1725eff89de8332e3fb26d6.1770759954.git.jpoimboe@kernel.org Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
1 parent 11439c4 commit f9fb44b

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

tools/objtool/klp-diff.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,6 +1364,9 @@ static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym
13641364
const char *sym_modname;
13651365
struct export *export;
13661366

1367+
if (convert_reloc_sym(e->patched, reloc))
1368+
continue;
1369+
13671370
/* Static branch/call keys are always STT_OBJECT */
13681371
if (reloc->sym->type != STT_OBJECT) {
13691372

0 commit comments

Comments
 (0)