From: Claudio Jeker Subject: always use ps_ppid to get the parent pid, instead of ps_pptr->ps_pid To: tech@openbsd.org Date: Mon, 30 Sep 2024 12:03:52 +0200 Use ps_ppid instead of ps_pptr->ps_pid in all places. Not sure why not all cases where converted when ps_ppid was introduced. -- :wq Claudio diff --git kern/kern_exit.c kern/kern_exit.c index 68830a47326..c1d5b8c0a16 100644 --- kern/kern_exit.c +++ kern/kern_exit.c @@ -746,7 +746,7 @@ proc_finish_wait(struct proc *waiter, struct process *pr) * If we got the child via a ptrace 'attach', * we need to give it back to the old parent. */ - if (pr->ps_oppid != 0 && (pr->ps_oppid != pr->ps_pptr->ps_pid) && + if (pr->ps_oppid != 0 && (pr->ps_oppid != pr->ps_ppid) && (tr = prfind(pr->ps_oppid))) { pr->ps_oppid = 0; atomic_clearbits_int(&pr->ps_flags, PS_TRACED); @@ -774,7 +774,7 @@ process_untrace(struct process *pr) KASSERT(pr->ps_flags & PS_TRACED); if (pr->ps_oppid != 0 && - (pr->ps_oppid != pr->ps_pptr->ps_pid)) + (pr->ps_oppid != pr->ps_ppid)) ppr = prfind(pr->ps_oppid); /* not being traced any more */ @@ -803,7 +803,7 @@ process_reparent(struct process *child, struct process *parent) return; KASSERT(child->ps_oppid == 0 || - child->ps_oppid == child->ps_pptr->ps_pid); + child->ps_oppid == child->ps_ppid); LIST_REMOVE(child, ps_sibling); LIST_INSERT_HEAD(&parent->ps_children, child, ps_sibling); diff --git kern/kern_sysctl.c kern/kern_sysctl.c index e015b530563..563c9f50632 100644 --- kern/kern_sysctl.c +++ kern/kern_sysctl.c @@ -1996,8 +1996,6 @@ fill_kproc(struct process *pr, struct kinfo_proc *ki, struct proc *p, show_pointers); /* stuff that's too painful to generalize into the macros */ - if (pr->ps_pptr) - ki->p_ppid = pr->ps_ppid; if (s->s_leader) ki->p_sid = s->s_leader->ps_pid; diff --git kern/sys_process.c kern/sys_process.c index 3e2b4586f59..c58f72f72a5 100644 --- kern/sys_process.c +++ kern/sys_process.c @@ -291,7 +291,7 @@ ptrace_ctrl(struct proc *p, int req, pid_t pid, caddr_t addr, int data) if (ISSET(tr->ps_flags, PS_TRACED)) return EBUSY; atomic_setbits_int(&tr->ps_flags, PS_TRACED); - tr->ps_oppid = tr->ps_pptr->ps_pid; + tr->ps_oppid = tr->ps_ppid; if (tr->ps_ptstat == NULL) tr->ps_ptstat = malloc(sizeof(*tr->ps_ptstat), M_SUBPROC, M_WAITOK); @@ -520,7 +520,7 @@ ptrace_ctrl(struct proc *p, int req, pid_t pid, caddr_t addr, int data) * Stop the target. */ atomic_setbits_int(&tr->ps_flags, PS_TRACED); - tr->ps_oppid = tr->ps_pptr->ps_pid; + tr->ps_oppid = tr->ps_ppid; process_reparent(tr, p->p_p); if (tr->ps_ptstat == NULL) tr->ps_ptstat = malloc(sizeof(*tr->ps_ptstat), diff --git kern/tty_tty.c kern/tty_tty.c index d34aa0cee9f..e9027c17d16 100644 --- kern/tty_tty.c +++ kern/tty_tty.c @@ -117,7 +117,7 @@ cttyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) return EINVAL; sess = p->p_p->ps_pgrp->pg_session; sess->s_verauthuid = p->p_ucred->cr_ruid; - sess->s_verauthppid = p->p_p->ps_pptr->ps_pid; + sess->s_verauthppid = p->p_p->ps_ppid; timeout_add_sec(&sess->s_verauthto, secs); return 0; case TIOCCLRVERAUTH: @@ -135,7 +135,7 @@ cttyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) */ sess = p->p_p->ps_pgrp->pg_session; if (sess->s_verauthuid == p->p_ucred->cr_ruid && - sess->s_verauthppid == p->p_p->ps_pptr->ps_pid) + sess->s_verauthppid == p->p_p->ps_ppid) return 0; return EPERM; } diff --git sys/sysctl.h sys/sysctl.h index 37bdfbb0dcf..71e1b9af174 100644 --- sys/sysctl.h +++ sys/sysctl.h @@ -568,7 +568,7 @@ struct kinfo_vmentry { * lim - source struct plimits * sa - source struct sigacts * There are some members that are not handled by these macros - * because they're too painful to generalize: p_ppid, p_sid, p_tdev, + * because they're too painful to generalize: p_sid, p_tdev, * p_tpgid, p_tsess, p_vm_rssize, p_u[us]time_{sec,usec}, p_cpuid */ @@ -645,6 +645,7 @@ do { \ (kp)->p_sigmask = (p)->p_sigmask; \ \ PR_LOCK(pr); \ + (kp)->p_ppid = (pr)->ps_ppid; \ (kp)->p_sigignore = (sa) ? (sa)->ps_sigignore : 0; \ (kp)->p_sigcatch = (sa) ? (sa)->ps_sigcatch : 0; \ \