• Masami Hiramatsu's avatar
    kprobes: Set unoptimized flag after unoptimizing code · f66c0447
    Masami Hiramatsu authored
    Set the unoptimized flag after confirming the code is completely
    unoptimized. Without this fix, when a kprobe hits the intermediate
    modified instruction (the first byte is replaced by an INT3, but
    later bytes can still be a jump address operand) while unoptimizing,
    it can return to the middle byte of the modified code, which causes
    an invalid instruction exception in the kernel.
    
    Usually, this is a rare case, but if we put a probe on the function
    call while text patching, it always causes a kernel panic as below:
    
     # echo p text_poke+5 > kprobe_events
     # echo 1 > events/kprobes/enable
     # echo 0 > events/kprobes/enable
    
    invalid opcode: 0000 [#1] PREEMPT SMP PTI
     RIP: 0010:text_poke+0x9/0x50
     Call Trace:
      arch_unoptimize_kprobe+0x22/0x28
      arch_unoptimize_kprobes+0x39/0x87
      kprobe_optimizer+0x6e/0x290
      process_one_work+0x2a0/0x610
      worker_thread+0x28/0x3d0
      ? process_one_work+0x610/0x610
      kthread+0x10d/0x130
      ? kthread_park+0x80/0x80
      ret_from_fork+0x3a/0x50
    
    text_poke() is used for patching the code in optprobes.
    
    This can happen even if we blacklist text_poke() and other functions,
    because there is a small time window during which we show the intermediate
    code to other CPUs.
    
     [ mingo: Edited the changelog. ]
    Tested-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: bristot@redhat.com
    Fixes: 6274de49 ("kprobes: Support delayed unoptimizing")
    Link: https://lkml.kernel.org/r/157483422375.25881.13508326028469515760.stgit@devnote2Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    f66c0447
kprobes.c 63.4 KB