10 #include <linux/capability.h>
11 #include <linux/export.h>
12 #include <linux/sched.h>
13 #include <linux/errno.h>
17 #include <linux/ptrace.h>
19 #include <linux/signal.h>
20 #include <linux/audit.h>
25 #include <linux/hw_breakpoint.h>
26 #include <linux/cn_proc.h>
29 static int ptrace_trapping_sleep_fn(
void *
flags)
45 child->
parent = new_parent;
84 spin_lock(&child->
sighand->siglock);
99 child->
signal->group_stop_count)) {
122 spin_unlock(&child->
sighand->siglock);
159 spin_lock_irq(&child->
sighand->siglock);
164 spin_unlock_irq(&child->
sighand->siglock);
168 if (!ret && !ignore_state)
184 static int __ptrace_may_access(
struct task_struct *
task,
unsigned int mode)
202 if (uid_eq(cred->
uid, tcred->euid) &&
203 uid_eq(cred->
uid, tcred->suid) &&
204 uid_eq(cred->
uid, tcred->uid) &&
205 gid_eq(cred->
gid, tcred->egid) &&
206 gid_eq(cred->
gid, tcred->sgid) &&
207 gid_eq(cred->
gid, tcred->gid))
209 if (ptrace_has_cap(tcred->user_ns, mode))
218 if (!dumpable && !ptrace_has_cap(
task_user_ns(task), mode))
228 err = __ptrace_may_access(task, mode);
256 if (same_thread_group(task,
current))
277 goto unlock_tasklist;
279 goto unlock_tasklist;
293 spin_lock(&task->
sighand->siglock);
316 spin_unlock(&task->
sighand->siglock);
339 static int ptrace_traceme(
void)
399 dead = !thread_group_leader(p);
401 if (!dead && thread_group_empty(p)) {
404 else if (ignoring_children(tracer->
sighand)) {
419 if (!valid_signal(data))
433 dead = __ptrace_detach(
current, child);
460 if (__ptrace_detach(tracer, p))
483 this_len = (len >
sizeof(
buf)) ?
sizeof(
buf) : len;
508 this_len = (len >
sizeof(
buf)) ?
sizeof(
buf) : len;
525 static int ptrace_setoptions(
struct task_struct *child,
unsigned long data)
546 if (lock_task_sighand(child, &flags)) {
552 unlock_task_sighand(child, &flags);
562 if (lock_task_sighand(child, &flags)) {
568 unlock_task_sighand(child, &flags);
574 #ifdef PTRACE_SINGLESTEP
575 #define is_singlestep(request) ((request) == PTRACE_SINGLESTEP)
577 #define is_singlestep(request) 0
580 #ifdef PTRACE_SINGLEBLOCK
581 #define is_singleblock(request) ((request) == PTRACE_SINGLEBLOCK)
583 #define is_singleblock(request) 0
587 #define is_sysemu_singlestep(request) ((request) == PTRACE_SYSEMU_SINGLESTEP)
589 #define is_sysemu_singlestep(request) 0
592 static int ptrace_resume(
struct task_struct *child,
long request,
595 if (!valid_signal(data))
603 #ifdef TIF_SYSCALL_EMU
628 #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
636 for (n = 0; n < view->
n; ++
n) {
645 static int ptrace_regset(
struct task_struct *task,
int req,
unsigned int type,
649 const struct user_regset *regset = find_regset(view, type);
652 if (!regset || (kiov->
iov_len % regset->
size) != 0)
655 regset_no = regset - view->
regsets;
660 return copy_regset_to_user(task, view, regset_no, 0,
663 return copy_regset_from_user(task, view, regset_no, 0,
670 unsigned long addr,
unsigned long data)
676 unsigned long __user *datalp = datavp;
687 #ifdef PTRACE_OLDSETOPTIONS
691 ret = ptrace_setoptions(child, data);
698 ret = ptrace_getsiginfo(child, &siginfo);
707 ret = ptrace_setsiginfo(child, &siginfo);
721 if (
unlikely(!seized || !lock_task_sighand(child, &flags)))
733 unlock_task_sighand(child, &flags);
746 if (
unlikely(!seized || !lock_task_sighand(child, &flags)))
760 unlock_task_sighand(child, &flags);
764 ret = ptrace_detach(child, data);
767 #ifdef CONFIG_BINFMT_ELF_FDPIC
770 unsigned long tmp = 0;
778 tmp = mm->
context.exec_fdpic_loadmap;
781 tmp = mm->
context.interp_fdpic_loadmap;
793 #ifdef PTRACE_SINGLESTEP
796 #ifdef PTRACE_SINGLEBLOCK
805 return ptrace_resume(child, request, data);
810 return ptrace_resume(child, request,
SIGKILL);
812 #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
817 struct iovec __user *uiov = datavp;
826 ret = ptrace_regset(child, request, addr, &kiov);
850 return ERR_PTR(-
ESRCH);
854 #ifndef arch_ptrace_attach
855 #define arch_ptrace_attach(child) do { } while (0)
865 ret = ptrace_traceme();
871 child = ptrace_get_task_struct(pid);
873 ret = PTR_ERR(child);
878 ret = ptrace_attach(child, request, addr, data);
885 goto out_put_task_struct;
891 goto out_put_task_struct;
896 put_task_struct(child);
908 if (copied !=
sizeof(tmp))
919 return (copied ==
sizeof(data)) ? 0 : -
EIO;
922 #if defined CONFIG_COMPAT
937 if (ret !=
sizeof(word))
946 ret = (ret !=
sizeof(
data) ? -
EIO : 0);
954 ret = ptrace_getsiginfo(child, &siginfo);
962 memset(&siginfo, 0,
sizeof siginfo);
967 ret = ptrace_setsiginfo(child, &siginfo);
969 #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
974 struct compat_iovec
__user *uiov =
975 (
struct compat_iovec
__user *) datap;
989 ret = ptrace_regset(child, request, addr, &kiov);
1010 ret = ptrace_traceme();
1014 child = ptrace_get_task_struct(pid);
1015 if (IS_ERR(child)) {
1016 ret = PTR_ERR(child);
1021 ret = ptrace_attach(child, request, addr, data);
1028 goto out_put_task_struct;
1036 out_put_task_struct:
1037 put_task_struct(child);
1043 #ifdef CONFIG_HAVE_HW_BREAKPOINT
1044 int ptrace_get_breakpoints(
struct task_struct *tsk)
1052 void ptrace_put_breakpoints(
struct task_struct *tsk)