Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
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

Download raw body.

Thread
  • Claudio Jeker:

    always use ps_ppid to get the parent pid, instead of ps_pptr->ps_pid

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;		\
 									\