• Oleg Nesterov's avatar
    uprobes/x86: Do not (ab)use TIF_SINGLESTEP/user_*_single_step() for single-stepping · 9bd1190a
    Oleg Nesterov authored
    user_enable/disable_single_step() was designed for ptrace, it assumes
    a single user and does unnecessary and wrong things for uprobes. For
    example:
    
    	- arch_uprobe_enable_step() can't trust TIF_SINGLESTEP, an
    	  application itself can set X86_EFLAGS_TF which must be
    	  preserved after arch_uprobe_disable_step().
    
    	- we do not want to set TIF_SINGLESTEP/TIF_FORCED_TF in
    	  arch_uprobe_enable_step(), this only makes sense for ptrace.
    
    	- otoh we leak TIF_SINGLESTEP if arch_uprobe_disable_step()
    	  doesn't do user_disable_single_step(), the application will
    	  be killed after the next syscall.
    
    	- arch_uprobe_enable_step() does access_process_vm() we do
    	  not need/want.
    
    Change arch_uprobe_enable/disable_step() to set/clear X86_EFLAGS_TF
    directly, this is much simpler and more correct. However, we need to
    clear TIF_BLOCKSTEP/DEBUGCTLMSR_BTF before executing the probed insn,
    add set_task_blockstep(false).
    
    Note: with or without this patch, there is another (hopefully minor)
    problem. A probed "pushf" insn can see the wrong X86_EFLAGS_TF set by
    uprobes. Perhaps we should change _disable to update the stack, or
    teach arch_uprobe_skip_sstep() to emulate this insn.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    9bd1190a
uprobes.c 22.3 KB