mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
A single fix for static calls to make the trampoline patching more robust
by placing explicit signature bytes after the call trampoline to prevent patching random other jumps like the CFI jump table entries. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmGRDKsTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoZeNEADEFTbUJKd8812O9vkY9we1GDAtH7bY z6sYkh0/rPvYjdPfHuwqW8tUAl+CO2ne2X8FRPKgEdRLg44BY4HaMHmujdbGh3fh zpqynUBPoOIgtWxAPGdF+JxjrKlzjFd+WwjG3qBXOF3pjKgCc5knyjTucsl6ced3 wF293rSYrIJ6uRv2TTNbM5hWJdC0arWbdMFnwQTxeZR54WLpu7Wfm+CCK41w0fAU nrfSsv73WEwpmAZNh04wsZsf7h6yCO7dCrIJD/3mpJtrUVBZXuZAKDzUzJPvHJal T8LcKwxZQAgPv0ubmOCrolj98Qp6PAPSdDJbzNsCJUYEbBqaB2inJ0PeHcZPspy9 YyW00EHXD2UKm/GNF/DIlhoiNxOSh8Wn4b6H5ZRML50bS7jsMp8YVbticWEjItL6 N4/61c45/uPILBS+Lysj0aqyj4TvagiuffJFWjw3YAQ+Gp/pzlJwRNjrw7/4DxAx KdpM881IKCR8UowBz3gIiA9FrJv2dGMqq31Rs1fjuauxkIX0gV3c64tAIRWrVscT k6GKGvHSis5cT97K3yhmNH0BUND+Skeku8G/SnTkefvcB85aU/7HBkLLJpw0w84F F6PTCaCJOEHrl3ADkilsi3z0sKWrph6aAzDEgp6Q6cmo9ulFAGw0bjuJb59xsvVK flIvTLUY3n76FA== =dgiF -----END PGP SIGNATURE----- Merge tag 'locking-urgent-2021-11-14' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull x86 static call update from Thomas Gleixner: "A single fix for static calls to make the trampoline patching more robust by placing explicit signature bytes after the call trampoline to prevent patching random other jumps like the CFI jump table entries" * tag 'locking-urgent-2021-11-14' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: static_call,x86: Robustify trampoline patching
This commit is contained in:
commit
218cc8b860
@ -27,6 +27,7 @@
|
||||
".globl " STATIC_CALL_TRAMP_STR(name) " \n" \
|
||||
STATIC_CALL_TRAMP_STR(name) ": \n" \
|
||||
insns " \n" \
|
||||
".byte 0x53, 0x43, 0x54 \n" \
|
||||
".type " STATIC_CALL_TRAMP_STR(name) ", @function \n" \
|
||||
".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \
|
||||
".popsection \n")
|
||||
|
@ -56,10 +56,15 @@ static void __ref __static_call_transform(void *insn, enum insn_type type, void
|
||||
text_poke_bp(insn, code, size, emulate);
|
||||
}
|
||||
|
||||
static void __static_call_validate(void *insn, bool tail)
|
||||
static void __static_call_validate(void *insn, bool tail, bool tramp)
|
||||
{
|
||||
u8 opcode = *(u8 *)insn;
|
||||
|
||||
if (tramp && memcmp(insn+5, "SCT", 3)) {
|
||||
pr_err("trampoline signature fail");
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (tail) {
|
||||
if (opcode == JMP32_INSN_OPCODE ||
|
||||
opcode == RET_INSN_OPCODE)
|
||||
@ -74,7 +79,8 @@ static void __static_call_validate(void *insn, bool tail)
|
||||
/*
|
||||
* If we ever trigger this, our text is corrupt, we'll probably not live long.
|
||||
*/
|
||||
WARN_ONCE(1, "unexpected static_call insn opcode 0x%x at %pS\n", opcode, insn);
|
||||
pr_err("unexpected static_call insn opcode 0x%x at %pS\n", opcode, insn);
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline enum insn_type __sc_insn(bool null, bool tail)
|
||||
@ -97,12 +103,12 @@ void arch_static_call_transform(void *site, void *tramp, void *func, bool tail)
|
||||
mutex_lock(&text_mutex);
|
||||
|
||||
if (tramp) {
|
||||
__static_call_validate(tramp, true);
|
||||
__static_call_validate(tramp, true, true);
|
||||
__static_call_transform(tramp, __sc_insn(!func, true), func);
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_HAVE_STATIC_CALL_INLINE) && site) {
|
||||
__static_call_validate(site, tail);
|
||||
__static_call_validate(site, tail, false);
|
||||
__static_call_transform(site, __sc_insn(!func, tail), func);
|
||||
}
|
||||
|
||||
|
@ -3310,6 +3310,9 @@ static bool ignore_unreachable_insn(struct objtool_file *file, struct instructio
|
||||
if (!insn->func)
|
||||
return false;
|
||||
|
||||
if (insn->func->static_call_tramp)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* CONFIG_UBSAN_TRAP inserts a UD2 when it sees
|
||||
* __builtin_unreachable(). The BUG() macro has an unreachable() after
|
||||
|
Loading…
Reference in New Issue
Block a user