mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
objtool/klp: Fix kCFI prefix finding/cloning
With CFI+CALL_PADDING, Clang places .Ltmp labels at the start of the NOP
padding (offset 5) between the __cfi_ prefix and the function entry
point. get_func_prefix() only checks the immediately previous symbol,
so the intervening .Ltmp label causes it to miss the __cfi_ prefix
symbol.
This results in klp-diff not cloning the kCFI type hash into the
livepatch module, causing a CFI failure at module load when calling
callback functions through indirect calls:
CFI failure at __klp_enable_patch+0xab/0x140
(target: pre_patch_callback+0x0/0x80 [livepatch_combined];
expected type: 0xde073954)
Instead of walking backward through the section's symbol list, just use
find_func_containing() for the byte before the function. This works now
that __cfi_ symbols are being grown by objtool to fill the padding.
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
@@ -539,10 +539,10 @@ static inline struct symbol *get_func_prefix(struct symbol *func)
|
||||
{
|
||||
struct symbol *prev;
|
||||
|
||||
if (!is_func_sym(func))
|
||||
if (!is_func_sym(func) || !func->offset)
|
||||
return NULL;
|
||||
|
||||
prev = sec_prev_sym(func);
|
||||
prev = find_func_containing(func->sec, func->offset - 1);
|
||||
if (prev && is_prefix_func(prev))
|
||||
return prev;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user