mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
ptrace/um: Replace PT_DTRACE with TIF_SINGLESTEP
commit c200e4bb44 upstream.
User mode linux is the last user of the PT_DTRACE flag. Using the flag to indicate
single stepping is a little confusing and worse changing tsk->ptrace without locking
could potentionally cause problems.
So use a thread info flag with a better name instead of flag in tsk->ptrace.
Remove the definition PT_DTRACE as uml is the last user.
Cc: stable@vger.kernel.org
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Tested-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Link: https://lkml.kernel.org/r/20220505182645.497868-3-ebiederm@xmission.com
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
92fb46536a
commit
6580673b17
|
|
@ -63,6 +63,7 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
#define TIF_RESTORE_SIGMASK 7
|
#define TIF_RESTORE_SIGMASK 7
|
||||||
#define TIF_NOTIFY_RESUME 8
|
#define TIF_NOTIFY_RESUME 8
|
||||||
#define TIF_SECCOMP 9 /* secure computing */
|
#define TIF_SECCOMP 9 /* secure computing */
|
||||||
|
#define TIF_SINGLESTEP 10 /* single stepping userspace */
|
||||||
|
|
||||||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
||||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||||
|
|
@ -70,5 +71,6 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
#define _TIF_MEMDIE (1 << TIF_MEMDIE)
|
#define _TIF_MEMDIE (1 << TIF_MEMDIE)
|
||||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||||
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
||||||
|
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
|
||||||
{
|
{
|
||||||
PT_REGS_IP(regs) = eip;
|
PT_REGS_IP(regs) = eip;
|
||||||
PT_REGS_SP(regs) = esp;
|
PT_REGS_SP(regs) = esp;
|
||||||
current->ptrace &= ~PT_DTRACE;
|
clear_thread_flag(TIF_SINGLESTEP);
|
||||||
#ifdef SUBARCH_EXECVE1
|
#ifdef SUBARCH_EXECVE1
|
||||||
SUBARCH_EXECVE1(regs->regs);
|
SUBARCH_EXECVE1(regs->regs);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -341,7 +341,7 @@ int singlestepping(void * t)
|
||||||
{
|
{
|
||||||
struct task_struct *task = t ? t : current;
|
struct task_struct *task = t ? t : current;
|
||||||
|
|
||||||
if (!(task->ptrace & PT_DTRACE))
|
if (!test_thread_flag(TIF_SINGLESTEP))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (task->thread.singlestep_syscall)
|
if (task->thread.singlestep_syscall)
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
void user_enable_single_step(struct task_struct *child)
|
void user_enable_single_step(struct task_struct *child)
|
||||||
{
|
{
|
||||||
child->ptrace |= PT_DTRACE;
|
set_tsk_thread_flag(child, TIF_SINGLESTEP);
|
||||||
child->thread.singlestep_syscall = 0;
|
child->thread.singlestep_syscall = 0;
|
||||||
|
|
||||||
#ifdef SUBARCH_SET_SINGLESTEPPING
|
#ifdef SUBARCH_SET_SINGLESTEPPING
|
||||||
|
|
@ -22,7 +22,7 @@ void user_enable_single_step(struct task_struct *child)
|
||||||
|
|
||||||
void user_disable_single_step(struct task_struct *child)
|
void user_disable_single_step(struct task_struct *child)
|
||||||
{
|
{
|
||||||
child->ptrace &= ~PT_DTRACE;
|
clear_tsk_thread_flag(child, TIF_SINGLESTEP);
|
||||||
child->thread.singlestep_syscall = 0;
|
child->thread.singlestep_syscall = 0;
|
||||||
|
|
||||||
#ifdef SUBARCH_SET_SINGLESTEPPING
|
#ifdef SUBARCH_SET_SINGLESTEPPING
|
||||||
|
|
@ -121,7 +121,7 @@ static void send_sigtrap(struct uml_pt_regs *regs, int error_code)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and
|
* XXX Check TIF_SINGLESTEP for singlestepping check and
|
||||||
* PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check
|
* PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check
|
||||||
*/
|
*/
|
||||||
int syscall_trace_enter(struct pt_regs *regs)
|
int syscall_trace_enter(struct pt_regs *regs)
|
||||||
|
|
@ -145,7 +145,7 @@ void syscall_trace_leave(struct pt_regs *regs)
|
||||||
audit_syscall_exit(regs);
|
audit_syscall_exit(regs);
|
||||||
|
|
||||||
/* Fake a debug trap */
|
/* Fake a debug trap */
|
||||||
if (ptraced & PT_DTRACE)
|
if (test_thread_flag(TIF_SINGLESTEP))
|
||||||
send_sigtrap(®s->regs, 0);
|
send_sigtrap(®s->regs, 0);
|
||||||
|
|
||||||
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||||
unsigned long sp;
|
unsigned long sp;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED))
|
if (test_thread_flag(TIF_SINGLESTEP) && (current->ptrace & PT_PTRACED))
|
||||||
singlestep = 1;
|
singlestep = 1;
|
||||||
|
|
||||||
/* Did we come from a system call? */
|
/* Did we come from a system call? */
|
||||||
|
|
@ -128,7 +128,7 @@ void do_signal(struct pt_regs *regs)
|
||||||
* on the host. The tracing thread will check this flag and
|
* on the host. The tracing thread will check this flag and
|
||||||
* PTRACE_SYSCALL if necessary.
|
* PTRACE_SYSCALL if necessary.
|
||||||
*/
|
*/
|
||||||
if (current->ptrace & PT_DTRACE)
|
if (test_thread_flag(TIF_SINGLESTEP))
|
||||||
current->thread.singlestep_syscall =
|
current->thread.singlestep_syscall =
|
||||||
is_syscall(PT_REGS_IP(¤t->thread.regs));
|
is_syscall(PT_REGS_IP(¤t->thread.regs));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ extern int ptrace_access_vm(struct task_struct *tsk, unsigned long addr,
|
||||||
|
|
||||||
#define PT_SEIZED 0x00010000 /* SEIZE used, enable new behavior */
|
#define PT_SEIZED 0x00010000 /* SEIZE used, enable new behavior */
|
||||||
#define PT_PTRACED 0x00000001
|
#define PT_PTRACED 0x00000001
|
||||||
#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */
|
|
||||||
|
|
||||||
#define PT_OPT_FLAG_SHIFT 3
|
#define PT_OPT_FLAG_SHIFT 3
|
||||||
/* PT_TRACE_* event enable flags */
|
/* PT_TRACE_* event enable flags */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user