Lines Matching full:child

69 void __ptrace_link(struct task_struct *child, struct task_struct *new_parent,  in __ptrace_link()  argument
72 BUG_ON(!list_empty(&child->ptrace_entry)); in __ptrace_link()
73 list_add(&child->ptrace_entry, &new_parent->ptraced); in __ptrace_link()
74 child->parent = new_parent; in __ptrace_link()
75 child->ptracer_cred = get_cred(ptracer_cred); in __ptrace_link()
84 static void ptrace_link(struct task_struct *child, struct task_struct *new_parent) in ptrace_link() argument
86 __ptrace_link(child, new_parent, current_cred()); in ptrace_link()
91 * @child: ptracee to be unlinked
93 * Remove @child from the ptrace list, move it back to the original parent,
117 void __ptrace_unlink(struct task_struct *child) in __ptrace_unlink() argument
120 BUG_ON(!child->ptrace); in __ptrace_unlink()
122 clear_task_syscall_work(child, SYSCALL_TRACE); in __ptrace_unlink()
124 clear_task_syscall_work(child, SYSCALL_EMU); in __ptrace_unlink()
127 child->parent = child->real_parent; in __ptrace_unlink()
128 list_del_init(&child->ptrace_entry); in __ptrace_unlink()
129 old_cred = child->ptracer_cred; in __ptrace_unlink()
130 child->ptracer_cred = NULL; in __ptrace_unlink()
133 spin_lock(&child->sighand->siglock); in __ptrace_unlink()
134 child->ptrace = 0; in __ptrace_unlink()
139 task_clear_jobctl_pending(child, JOBCTL_TRAP_MASK); in __ptrace_unlink()
140 task_clear_jobctl_trapping(child); in __ptrace_unlink()
144 * @child isn't dead. in __ptrace_unlink()
146 if (!(child->flags & PF_EXITING) && in __ptrace_unlink()
147 (child->signal->flags & SIGNAL_STOP_STOPPED || in __ptrace_unlink()
148 child->signal->group_stop_count)) in __ptrace_unlink()
149 child->jobctl |= JOBCTL_STOP_PENDING; in __ptrace_unlink()
153 * @child in the butt. Note that @resume should be used iff @child in __ptrace_unlink()
157 if (child->jobctl & JOBCTL_STOP_PENDING || task_is_traced(child)) in __ptrace_unlink()
158 ptrace_signal_wake_up(child, true); in __ptrace_unlink()
160 spin_unlock(&child->sighand->siglock); in __ptrace_unlink()
208 * The child may be awake and may have cleared in ptrace_unfreeze_traced()
209 * JOBCTL_PTRACE_FROZEN (see ptrace_resume). The child will in ptrace_unfreeze_traced()
224 * @child: ptracee to check for
225 * @ignore_state: don't check whether @child is currently %TASK_TRACED
227 * Check whether @child is being ptraced by %current and ready for further
228 * ptrace operations. If @ignore_state is %false, @child also should be in
229 * %TASK_TRACED state and on return the child is guaranteed to be traced
230 * and not executing. If @ignore_state is %true, @child can be in any
234 * Grabs and releases tasklist_lock and @child->sighand->siglock.
237 * 0 on success, -ESRCH if %child is not ready.
239 static int ptrace_check_attach(struct task_struct *child, bool ignore_state) in ptrace_check_attach() argument
245 * possible race where someone else was tracing our child and in ptrace_check_attach()
247 * we are sure that this is our traced child and that can only in ptrace_check_attach()
251 if (child->ptrace && child->parent == current) { in ptrace_check_attach()
253 * child->sighand can't be NULL, release_task() in ptrace_check_attach()
256 if (ignore_state || ptrace_freeze_traced(child)) in ptrace_check_attach()
262 WARN_ON_ONCE(!wait_task_inactive(child, __TASK_TRACED|TASK_FROZEN))) in ptrace_check_attach()
293 * because setting up the necessary parent/child relationship in __ptrace_may_access()
388 * will be cleared if the child completes the transition or any in ptrace_set_stopped()
533 * If it's our own child, there is no notification to do. But if our normal
534 * children self-reap, then this child was prevented by ptrace and we must
563 static int ptrace_detach(struct task_struct *child, unsigned int data) in ptrace_detach() argument
569 ptrace_disable(child); in ptrace_detach()
576 WARN_ON(!child->ptrace || child->exit_state); in ptrace_detach()
581 child->exit_code = data; in ptrace_detach()
582 __ptrace_detach(current, child); in ptrace_detach()
585 proc_ptrace_connector(child, PTRACE_DETACH); in ptrace_detach()
659 static int ptrace_setoptions(struct task_struct *child, unsigned long data) in ptrace_setoptions() argument
669 flags = child->ptrace; in ptrace_setoptions()
672 child->ptrace = flags; in ptrace_setoptions()
677 static int ptrace_getsiginfo(struct task_struct *child, kernel_siginfo_t *info) in ptrace_getsiginfo() argument
682 if (lock_task_sighand(child, &flags)) { in ptrace_getsiginfo()
684 if (likely(child->last_siginfo != NULL)) { in ptrace_getsiginfo()
685 copy_siginfo(info, child->last_siginfo); in ptrace_getsiginfo()
688 unlock_task_sighand(child, &flags); in ptrace_getsiginfo()
693 static int ptrace_setsiginfo(struct task_struct *child, const kernel_siginfo_t *info) in ptrace_setsiginfo() argument
698 if (lock_task_sighand(child, &flags)) { in ptrace_setsiginfo()
700 if (likely(child->last_siginfo != NULL)) { in ptrace_setsiginfo()
701 copy_siginfo(child->last_siginfo, info); in ptrace_setsiginfo()
704 unlock_task_sighand(child, &flags); in ptrace_setsiginfo()
709 static int ptrace_peek_siginfo(struct task_struct *child, in ptrace_peek_siginfo() argument
734 pending = &child->signal->shared_pending; in ptrace_peek_siginfo()
736 pending = &child->pending; in ptrace_peek_siginfo()
743 spin_lock_irq(&child->sighand->siglock); in ptrace_peek_siginfo()
751 spin_unlock_irq(&child->sighand->siglock); in ptrace_peek_siginfo()
823 static int ptrace_resume(struct task_struct *child, long request, in ptrace_resume() argument
830 set_task_syscall_work(child, SYSCALL_TRACE); in ptrace_resume()
832 clear_task_syscall_work(child, SYSCALL_TRACE); in ptrace_resume()
836 set_task_syscall_work(child, SYSCALL_EMU); in ptrace_resume()
838 clear_task_syscall_work(child, SYSCALL_EMU); in ptrace_resume()
844 user_enable_block_step(child); in ptrace_resume()
848 user_enable_single_step(child); in ptrace_resume()
850 user_disable_single_step(child); in ptrace_resume()
862 spin_lock_irq(&child->sighand->siglock); in ptrace_resume()
863 child->exit_code = data; in ptrace_resume()
864 child->jobctl &= ~JOBCTL_TRACED; in ptrace_resume()
865 wake_up_state(child, __TASK_TRACED); in ptrace_resume()
866 spin_unlock_irq(&child->sighand->siglock); in ptrace_resume()
918 ptrace_get_syscall_info_entry(struct task_struct *child, struct pt_regs *regs, in ptrace_get_syscall_info_entry() argument
924 info->entry.nr = syscall_get_nr(child, regs); in ptrace_get_syscall_info_entry()
925 syscall_get_arguments(child, regs, args); in ptrace_get_syscall_info_entry()
934 ptrace_get_syscall_info_seccomp(struct task_struct *child, struct pt_regs *regs, in ptrace_get_syscall_info_seccomp() argument
944 ptrace_get_syscall_info_entry(child, regs, info); in ptrace_get_syscall_info_seccomp()
945 info->seccomp.ret_data = child->ptrace_message; in ptrace_get_syscall_info_seccomp()
955 ptrace_get_syscall_info_exit(struct task_struct *child, struct pt_regs *regs, in ptrace_get_syscall_info_exit() argument
958 info->exit.rval = syscall_get_error(child, regs); in ptrace_get_syscall_info_exit()
961 info->exit.rval = syscall_get_return_value(child, regs); in ptrace_get_syscall_info_exit()
968 ptrace_get_syscall_info_op(struct task_struct *child) in ptrace_get_syscall_info_op() argument
972 * child->last_siginfo because ptrace_freeze_traced() in ptrace_get_syscall_info_op()
976 switch (child->last_siginfo ? child->last_siginfo->si_code : 0) { in ptrace_get_syscall_info_op()
978 switch (child->ptrace_message) { in ptrace_get_syscall_info_op()
994 ptrace_get_syscall_info(struct task_struct *child, unsigned long user_size, in ptrace_get_syscall_info() argument
997 struct pt_regs *regs = task_pt_regs(child); in ptrace_get_syscall_info()
999 .op = ptrace_get_syscall_info_op(child), in ptrace_get_syscall_info()
1000 .arch = syscall_get_arch(child), in ptrace_get_syscall_info()
1009 actual_size = ptrace_get_syscall_info_entry(child, regs, &info); in ptrace_get_syscall_info()
1012 actual_size = ptrace_get_syscall_info_exit(child, regs, &info); in ptrace_get_syscall_info()
1015 actual_size = ptrace_get_syscall_info_seccomp(child, regs, &info); in ptrace_get_syscall_info()
1024 ptrace_set_syscall_info_entry(struct task_struct *child, struct pt_regs *regs, in ptrace_set_syscall_info_entry() argument
1050 syscall_set_nr(child, regs, nr); in ptrace_set_syscall_info_entry()
1058 syscall_set_arguments(child, regs, args); in ptrace_set_syscall_info_entry()
1064 ptrace_set_syscall_info_seccomp(struct task_struct *child, struct pt_regs *regs, in ptrace_set_syscall_info_seccomp() argument
1071 return ptrace_set_syscall_info_entry(child, regs, info); in ptrace_set_syscall_info_seccomp()
1075 ptrace_set_syscall_info_exit(struct task_struct *child, struct pt_regs *regs, in ptrace_set_syscall_info_exit() argument
1089 syscall_set_return_value(child, regs, rval, 0); in ptrace_set_syscall_info_exit()
1091 syscall_set_return_value(child, regs, 0, rval); in ptrace_set_syscall_info_exit()
1097 ptrace_set_syscall_info(struct task_struct *child, unsigned long user_size, in ptrace_set_syscall_info() argument
1100 struct pt_regs *regs = task_pt_regs(child); in ptrace_set_syscall_info()
1119 if (ptrace_get_syscall_info_op(child) != info.op) in ptrace_set_syscall_info()
1124 return ptrace_set_syscall_info_entry(child, regs, &info); in ptrace_set_syscall_info()
1126 return ptrace_set_syscall_info_exit(child, regs, &info); in ptrace_set_syscall_info()
1128 return ptrace_set_syscall_info_seccomp(child, regs, &info); in ptrace_set_syscall_info()
1136 int ptrace_request(struct task_struct *child, long request, in ptrace_request() argument
1139 bool seized = child->ptrace & PT_SEIZED; in ptrace_request()
1149 return generic_ptrace_peekdata(child, addr, data); in ptrace_request()
1152 return generic_ptrace_pokedata(child, addr, data); in ptrace_request()
1158 ret = ptrace_setoptions(child, data); in ptrace_request()
1161 ret = put_user(child->ptrace_message, datalp); in ptrace_request()
1165 ret = ptrace_peek_siginfo(child, addr, data); in ptrace_request()
1169 ret = ptrace_getsiginfo(child, &siginfo); in ptrace_request()
1177 ret = ptrace_setsiginfo(child, &siginfo); in ptrace_request()
1188 if (test_tsk_restore_sigmask(child)) in ptrace_request()
1189 mask = &child->saved_sigmask; in ptrace_request()
1191 mask = &child->blocked; in ptrace_request()
1221 spin_lock_irq(&child->sighand->siglock); in ptrace_request()
1222 child->blocked = new_set; in ptrace_request()
1223 spin_unlock_irq(&child->sighand->siglock); in ptrace_request()
1225 clear_tsk_restore_sigmask(child); in ptrace_request()
1235 * after this request. If @child is already trapped, the in ptrace_request()
1242 if (unlikely(!seized || !lock_task_sighand(child, &flags))) in ptrace_request()
1251 if (likely(task_set_jobctl_pending(child, JOBCTL_TRAP_STOP))) in ptrace_request()
1252 ptrace_signal_wake_up(child, child->jobctl & JOBCTL_LISTENING); in ptrace_request()
1254 unlock_task_sighand(child, &flags); in ptrace_request()
1267 if (unlikely(!seized || !lock_task_sighand(child, &flags))) in ptrace_request()
1270 si = child->last_siginfo; in ptrace_request()
1272 child->jobctl |= JOBCTL_LISTENING; in ptrace_request()
1277 if (child->jobctl & JOBCTL_TRAP_NOTIFY) in ptrace_request()
1278 ptrace_signal_wake_up(child, true); in ptrace_request()
1281 unlock_task_sighand(child, &flags); in ptrace_request()
1285 ret = ptrace_detach(child, data); in ptrace_request()
1290 struct mm_struct *mm = get_task_mm(child); in ptrace_request()
1324 return ptrace_resume(child, request, data); in ptrace_request()
1327 send_sig_info(SIGKILL, SEND_SIG_NOINFO, child); in ptrace_request()
1343 ret = ptrace_regset(child, request, addr, &kiov); in ptrace_request()
1350 ret = ptrace_get_syscall_info(child, addr, datavp); in ptrace_request()
1354 ret = ptrace_set_syscall_info(child, addr, datavp); in ptrace_request()
1359 ret = seccomp_get_filter(child, addr, datavp); in ptrace_request()
1363 ret = seccomp_get_metadata(child, addr, datavp); in ptrace_request()
1368 ret = ptrace_get_rseq_configuration(child, addr, datavp); in ptrace_request()
1373 ret = syscall_user_dispatch_set_config(child, addr, datavp); in ptrace_request()
1377 ret = syscall_user_dispatch_get_config(child, addr, datavp); in ptrace_request()
1390 struct task_struct *child; in SYSCALL_DEFINE4() local
1398 child = find_get_task_by_vpid(pid); in SYSCALL_DEFINE4()
1399 if (!child) { in SYSCALL_DEFINE4()
1405 ret = ptrace_attach(child, request, addr, data); in SYSCALL_DEFINE4()
1409 ret = ptrace_check_attach(child, request == PTRACE_KILL || in SYSCALL_DEFINE4()
1414 ret = arch_ptrace(child, request, addr, data); in SYSCALL_DEFINE4()
1416 ptrace_unfreeze_traced(child); in SYSCALL_DEFINE4()
1419 put_task_struct(child); in SYSCALL_DEFINE4()
1448 int compat_ptrace_request(struct task_struct *child, compat_long_t request, in compat_ptrace_request() argument
1459 ret = ptrace_access_vm(child, addr, &word, sizeof(word), in compat_ptrace_request()
1469 ret = ptrace_access_vm(child, addr, &data, sizeof(data), in compat_ptrace_request()
1475 ret = put_user((compat_ulong_t) child->ptrace_message, datap); in compat_ptrace_request()
1479 ret = ptrace_getsiginfo(child, &siginfo); in compat_ptrace_request()
1490 ret = ptrace_setsiginfo(child, &siginfo); in compat_ptrace_request()
1512 ret = ptrace_regset(child, request, addr, &kiov); in compat_ptrace_request()
1520 ret = ptrace_request(child, request, addr, data); in compat_ptrace_request()
1529 struct task_struct *child; in COMPAT_SYSCALL_DEFINE4() local
1537 child = find_get_task_by_vpid(pid); in COMPAT_SYSCALL_DEFINE4()
1538 if (!child) { in COMPAT_SYSCALL_DEFINE4()
1544 ret = ptrace_attach(child, request, addr, data); in COMPAT_SYSCALL_DEFINE4()
1548 ret = ptrace_check_attach(child, request == PTRACE_KILL || in COMPAT_SYSCALL_DEFINE4()
1551 ret = compat_arch_ptrace(child, request, addr, data); in COMPAT_SYSCALL_DEFINE4()
1553 ptrace_unfreeze_traced(child); in COMPAT_SYSCALL_DEFINE4()
1557 put_task_struct(child); in COMPAT_SYSCALL_DEFINE4()