• Benjamin Gray's avatar
    powerpc/watchpoints: Track perf single step directly on the breakpoint · 1e60f356
    Benjamin Gray authored
    There is a bug in the current watchpoint tracking logic, where the
    teardown in arch_unregister_hw_breakpoint() uses bp->ctx->task, which it
    does not have a reference of and parallel threads may be in the process
    of destroying. This was partially addressed in commit fb822e60
    ("powerpc/hw_breakpoint: Fix oops when destroying hw_breakpoint event"),
    but the underlying issue of accessing a struct member in an unknown
    state still remained. Syzkaller managed to trigger a null pointer
    derefernce due to the race between the task destructor and checking the
    pointer and dereferencing it in the loop.
    
    While this null pointer dereference could be fixed by using READ_ONCE
    to access the task up front, that just changes the error to manipulating
    possbily freed memory.
    
    Instead, the breakpoint logic needs to be reworked to remove any
    dependency on a context or task struct during breakpoint removal.
    
    The reason we have this currently is to clear thread.last_hit_ubp. This
    member is used to differentiate the perf DAWR single-step sequence from
    other causes of single-step, such as userspace just calling
    ptrace(PTRACE_SINGLESTEP, ...). We need to differentiate them because,
    when the single step interrupt is received, we need to know whether to
    re-insert the DAWR breakpoint (perf) or not (ptrace / other).
    
    arch_unregister_hw_breakpoint() needs to clear this information to
    prevent dangling pointers to possibly freed memory. These pointers are
    dereferenced in single_step_dabr_instruction() without a way to check
    their validity.
    
    This patch moves the tracking of this information to the breakpoint
    itself. This means we no longer have to do anything special to clean up.
    Signed-off-by: default avatarBenjamin Gray <bgray@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://msgid.link/20230801011744.153973-4-bgray@linux.ibm.com
    1e60f356
processor.h 12.7 KB