Lines Matching refs:child
63 void __ptrace_link(struct task_struct *child, struct task_struct *new_parent, in __ptrace_link() argument
66 BUG_ON(!list_empty(&child->ptrace_entry)); in __ptrace_link()
67 list_add(&child->ptrace_entry, &new_parent->ptraced); in __ptrace_link()
68 child->parent = new_parent; in __ptrace_link()
69 child->ptracer_cred = get_cred(ptracer_cred); in __ptrace_link()
78 static void ptrace_link(struct task_struct *child, struct task_struct *new_parent) in ptrace_link() argument
81 __ptrace_link(child, new_parent, __task_cred(new_parent)); in ptrace_link()
113 void __ptrace_unlink(struct task_struct *child) in __ptrace_unlink() argument
116 BUG_ON(!child->ptrace); in __ptrace_unlink()
118 clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); in __ptrace_unlink()
120 child->parent = child->real_parent; in __ptrace_unlink()
121 list_del_init(&child->ptrace_entry); in __ptrace_unlink()
122 old_cred = child->ptracer_cred; in __ptrace_unlink()
123 child->ptracer_cred = NULL; in __ptrace_unlink()
126 spin_lock(&child->sighand->siglock); in __ptrace_unlink()
127 child->ptrace = 0; in __ptrace_unlink()
132 task_clear_jobctl_pending(child, JOBCTL_TRAP_MASK); in __ptrace_unlink()
133 task_clear_jobctl_trapping(child); in __ptrace_unlink()
139 if (!(child->flags & PF_EXITING) && in __ptrace_unlink()
140 (child->signal->flags & SIGNAL_STOP_STOPPED || in __ptrace_unlink()
141 child->signal->group_stop_count)) { in __ptrace_unlink()
142 child->jobctl |= JOBCTL_STOP_PENDING; in __ptrace_unlink()
151 if (!(child->jobctl & JOBCTL_STOP_SIGMASK)) in __ptrace_unlink()
152 child->jobctl |= SIGSTOP; in __ptrace_unlink()
161 if (child->jobctl & JOBCTL_STOP_PENDING || task_is_traced(child)) in __ptrace_unlink()
162 ptrace_signal_wake_up(child, true); in __ptrace_unlink()
164 spin_unlock(&child->sighand->siglock); in __ptrace_unlink()
224 static int ptrace_check_attach(struct task_struct *child, bool ignore_state) in ptrace_check_attach() argument
236 if (child->ptrace && child->parent == current) { in ptrace_check_attach()
237 WARN_ON(child->state == __TASK_TRACED); in ptrace_check_attach()
242 if (ignore_state || ptrace_freeze_traced(child)) in ptrace_check_attach()
248 if (!wait_task_inactive(child, __TASK_TRACED)) { in ptrace_check_attach()
254 WARN_ON(child->state == __TASK_TRACED); in ptrace_check_attach()
529 static int ptrace_detach(struct task_struct *child, unsigned int data) in ptrace_detach() argument
535 ptrace_disable(child); in ptrace_detach()
542 WARN_ON(!child->ptrace || child->exit_state); in ptrace_detach()
547 child->exit_code = data; in ptrace_detach()
548 __ptrace_detach(current, child); in ptrace_detach()
551 proc_ptrace_connector(child, PTRACE_DETACH); in ptrace_detach()
625 static int ptrace_setoptions(struct task_struct *child, unsigned long data) in ptrace_setoptions() argument
646 flags = child->ptrace; in ptrace_setoptions()
649 child->ptrace = flags; in ptrace_setoptions()
654 static int ptrace_getsiginfo(struct task_struct *child, siginfo_t *info) in ptrace_getsiginfo() argument
659 if (lock_task_sighand(child, &flags)) { in ptrace_getsiginfo()
661 if (likely(child->last_siginfo != NULL)) { in ptrace_getsiginfo()
662 copy_siginfo(info, child->last_siginfo); in ptrace_getsiginfo()
665 unlock_task_sighand(child, &flags); in ptrace_getsiginfo()
670 static int ptrace_setsiginfo(struct task_struct *child, const siginfo_t *info) in ptrace_setsiginfo() argument
675 if (lock_task_sighand(child, &flags)) { in ptrace_setsiginfo()
677 if (likely(child->last_siginfo != NULL)) { in ptrace_setsiginfo()
678 copy_siginfo(child->last_siginfo, info); in ptrace_setsiginfo()
681 unlock_task_sighand(child, &flags); in ptrace_setsiginfo()
686 static int ptrace_peek_siginfo(struct task_struct *child, in ptrace_peek_siginfo() argument
707 pending = &child->signal->shared_pending; in ptrace_peek_siginfo()
709 pending = &child->pending; in ptrace_peek_siginfo()
715 spin_lock_irq(&child->sighand->siglock); in ptrace_peek_siginfo()
722 spin_unlock_irq(&child->sighand->siglock); in ptrace_peek_siginfo()
780 static int ptrace_resume(struct task_struct *child, long request, in ptrace_resume() argument
789 set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); in ptrace_resume()
791 clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); in ptrace_resume()
795 set_tsk_thread_flag(child, TIF_SYSCALL_EMU); in ptrace_resume()
797 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); in ptrace_resume()
803 user_enable_block_step(child); in ptrace_resume()
807 user_enable_single_step(child); in ptrace_resume()
809 user_disable_single_step(child); in ptrace_resume()
827 spin_lock_irq(&child->sighand->siglock); in ptrace_resume()
828 child->exit_code = data; in ptrace_resume()
829 wake_up_state(child, __TASK_TRACED); in ptrace_resume()
831 spin_unlock_irq(&child->sighand->siglock); in ptrace_resume()
883 int ptrace_request(struct task_struct *child, long request, in ptrace_request() argument
886 bool seized = child->ptrace & PT_SEIZED; in ptrace_request()
896 return generic_ptrace_peekdata(child, addr, data); in ptrace_request()
899 return generic_ptrace_pokedata(child, addr, data); in ptrace_request()
905 ret = ptrace_setoptions(child, data); in ptrace_request()
908 ret = put_user(child->ptrace_message, datalp); in ptrace_request()
912 ret = ptrace_peek_siginfo(child, addr, data); in ptrace_request()
916 ret = ptrace_getsiginfo(child, &siginfo); in ptrace_request()
925 ret = ptrace_setsiginfo(child, &siginfo); in ptrace_request()
934 if (copy_to_user(datavp, &child->blocked, sizeof(sigset_t))) in ptrace_request()
961 spin_lock_irq(&child->sighand->siglock); in ptrace_request()
962 child->blocked = new_set; in ptrace_request()
963 spin_unlock_irq(&child->sighand->siglock); in ptrace_request()
980 if (unlikely(!seized || !lock_task_sighand(child, &flags))) in ptrace_request()
989 if (likely(task_set_jobctl_pending(child, JOBCTL_TRAP_STOP))) in ptrace_request()
990 ptrace_signal_wake_up(child, child->jobctl & JOBCTL_LISTENING); in ptrace_request()
992 unlock_task_sighand(child, &flags); in ptrace_request()
1005 if (unlikely(!seized || !lock_task_sighand(child, &flags))) in ptrace_request()
1008 si = child->last_siginfo; in ptrace_request()
1010 child->jobctl |= JOBCTL_LISTENING; in ptrace_request()
1015 if (child->jobctl & JOBCTL_TRAP_NOTIFY) in ptrace_request()
1016 ptrace_signal_wake_up(child, true); in ptrace_request()
1019 unlock_task_sighand(child, &flags); in ptrace_request()
1023 ret = ptrace_detach(child, data); in ptrace_request()
1028 struct mm_struct *mm = get_task_mm(child); in ptrace_request()
1064 return ptrace_resume(child, request, data); in ptrace_request()
1067 if (child->exit_state) /* already dead */ in ptrace_request()
1069 return ptrace_resume(child, request, SIGKILL); in ptrace_request()
1084 ret = ptrace_regset(child, request, addr, &kiov); in ptrace_request()
1092 ret = seccomp_get_filter(child, addr, datavp); in ptrace_request()
1096 ret = seccomp_get_metadata(child, addr, datavp); in ptrace_request()
1107 #define arch_ptrace_attach(child) do { } while (0) argument
1113 struct task_struct *child; in SYSCALL_DEFINE4() local
1123 child = find_get_task_by_vpid(pid); in SYSCALL_DEFINE4()
1124 if (!child) { in SYSCALL_DEFINE4()
1130 ret = ptrace_attach(child, request, addr, data); in SYSCALL_DEFINE4()
1136 arch_ptrace_attach(child); in SYSCALL_DEFINE4()
1140 ret = ptrace_check_attach(child, request == PTRACE_KILL || in SYSCALL_DEFINE4()
1145 ret = arch_ptrace(child, request, addr, data); in SYSCALL_DEFINE4()
1147 ptrace_unfreeze_traced(child); in SYSCALL_DEFINE4()
1150 put_task_struct(child); in SYSCALL_DEFINE4()
1179 int compat_ptrace_request(struct task_struct *child, compat_long_t request, in compat_ptrace_request() argument
1190 ret = ptrace_access_vm(child, addr, &word, sizeof(word), in compat_ptrace_request()
1200 ret = ptrace_access_vm(child, addr, &data, sizeof(data), in compat_ptrace_request()
1206 ret = put_user((compat_ulong_t) child->ptrace_message, datap); in compat_ptrace_request()
1210 ret = ptrace_getsiginfo(child, &siginfo); in compat_ptrace_request()
1222 ret = ptrace_setsiginfo(child, &siginfo); in compat_ptrace_request()
1244 ret = ptrace_regset(child, request, addr, &kiov); in compat_ptrace_request()
1252 ret = ptrace_request(child, request, addr, data); in compat_ptrace_request()
1261 struct task_struct *child; in COMPAT_SYSCALL_DEFINE4() local
1269 child = find_get_task_by_vpid(pid); in COMPAT_SYSCALL_DEFINE4()
1270 if (!child) { in COMPAT_SYSCALL_DEFINE4()
1276 ret = ptrace_attach(child, request, addr, data); in COMPAT_SYSCALL_DEFINE4()
1282 arch_ptrace_attach(child); in COMPAT_SYSCALL_DEFINE4()
1286 ret = ptrace_check_attach(child, request == PTRACE_KILL || in COMPAT_SYSCALL_DEFINE4()
1289 ret = compat_arch_ptrace(child, request, addr, data); in COMPAT_SYSCALL_DEFINE4()
1291 ptrace_unfreeze_traced(child); in COMPAT_SYSCALL_DEFINE4()
1295 put_task_struct(child); in COMPAT_SYSCALL_DEFINE4()