On 08/02, Liao, Chang wrote: > > > 在 2024/8/1 22:06, Oleg Nesterov 写道: > > On 08/01, Liao Chang wrote: > >> > >> @@ -2276,22 +2277,25 @@ static void handle_singlestep(struct uprobe_task > >> *utask, struct pt_regs *regs) > >> int err = 0; > >> > >> uprobe = utask->active_uprobe; > >> - if (utask->state == UTASK_SSTEP_ACK) > >> + switch (utask->state) { > >> + case UTASK_SSTEP_ACK: > >> err = arch_uprobe_post_xol(&uprobe->arch, regs); > >> - else if (utask->state == UTASK_SSTEP_TRAPPED) > >> + break; > >> + case UTASK_SSTEP_TRAPPED: > >> arch_uprobe_abort_xol(&uprobe->arch, regs); > >> - else > >> + fallthrough; > >> + case UTASK_SSTEP_DENY_SIGNAL: > >> + set_tsk_thread_flag(current, TIF_SIGPENDING); > >> + break; > >> + default: > >> WARN_ON_ONCE(1); > >> + } > > > > Liao, at first glance this change looks "obviously wrong" to me. > > Oleg. Did i overlook some thing obvious here?
OK, lets suppose uprobe_deny_signal() sets UTASK_SSTEP_DENY_SIGNAL. In this case handle_singlestep() will only set TIF_SIGPENDING and do nothing else. This is wrong, either _post_xol() or _abort_xol() must be called. But I think handle_singlestep() will never hit this case. In the likely case uprobe_post_sstep_notifier() will replace _DENY_SIGNAL with _ACK, and this means that handle_singlestep() won't restore TIF_SIGPENDING cleared by uprobe_deny_signal(). Oleg.