This allows us to unlock getppid(2). Also NetBSD, DragonflyBSD and OSX
do the same.
Index: kern/exec_elf.c
===================================================================
RCS file: /cvs/src/sys/kern/exec_elf.c,v
retrieving revision 1.156
diff -u -p -r1.156 exec_elf.c
--- kern/exec_elf.c 7 Dec 2020 16:55:28 -0000 1.156
+++ kern/exec_elf.c 2 Jan 2021 15:47:46 -0000
@@ -1257,7 +1257,7 @@ coredump_notes_elf(struct proc *p, void
cpi.cpi_sigcatch = pr->ps_sigacts->ps_sigcatch;
cpi.cpi_pid = pr->ps_pid;
- cpi.cpi_ppid = pr->ps_pptr->ps_pid;
+ cpi.cpi_ppid = pr->ps_ppid;
cpi.cpi_pgrp = pr->ps_pgid;
if (pr->ps_session->s_leader)
cpi.cpi_sid = pr->ps_session->s_leader->ps_pid;
Index: kern/kern_exit.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.193
diff -u -p -r1.193 kern_exit.c
--- kern/kern_exit.c 9 Dec 2020 18:58:19 -0000 1.193
+++ kern/kern_exit.c 2 Jan 2021 15:47:46 -0000
@@ -694,6 +694,7 @@ process_reparent(struct process *child,
}
child->ps_pptr = parent;
+ child->ps_ppid = parent->ps_pid;
}
void
Index: kern/kern_fork.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_fork.c,v
retrieving revision 1.230
diff -u -p -r1.230 kern_fork.c
--- kern/kern_fork.c 7 Dec 2020 16:55:28 -0000 1.230
+++ kern/kern_fork.c 2 Jan 2021 15:47:46 -0000
@@ -231,6 +231,7 @@ process_new(struct proc *p, struct proce
/* post-copy fixups */
pr->ps_pptr = parent;
+ pr->ps_ppid = parent->ps_pid;
/* bump references to the text vnode (for sysctl) */
pr->ps_textvp = parent->ps_textvp;
Index: kern/kern_prot.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_prot.c,v
retrieving revision 1.76
diff -u -p -r1.76 kern_prot.c
--- kern/kern_prot.c 9 Jul 2019 12:23:25 -0000 1.76
+++ kern/kern_prot.c 2 Jan 2021 15:47:46 -0000
@@ -84,7 +84,7 @@ int
sys_getppid(struct proc *p, void *v, register_t *retval)
{
- *retval = p->p_p->ps_pptr->ps_pid;
+ *retval = p->p_p->ps_ppid;
return (0);
}
Index: kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.385
diff -u -p -r1.385 kern_sysctl.c
--- kern/kern_sysctl.c 28 Dec 2020 18:28:11 -0000 1.385
+++ kern/kern_sysctl.c 2 Jan 2021 15:47:46 -0000
@@ -1666,7 +1666,7 @@ fill_kproc(struct process *pr, struct ki
/* stuff that's too painful to generalize into the macros */
if (pr->ps_pptr)
- ki->p_ppid = pr->ps_pptr->ps_pid;
+ ki->p_ppid = pr->ps_ppid;
if (s->s_leader)
ki->p_sid = s->s_leader->ps_pid;
Index: sys/proc.h
===================================================================
RCS file: /cvs/src/sys/sys/proc.h,v
retrieving revision 1.303
diff -u -p -r1.303 proc.h
--- sys/proc.h 9 Dec 2020 18:58:19 -0000 1.303
+++ sys/proc.h 2 Jan 2021 15:47:47 -0000
@@ -216,6 +216,7 @@ struct process {
u_int ps_xexit; /* Exit status for wait */
int ps_xsig; /* Stopping or killing signal */
+ pid_t ps_ppid; /* Cached parent pid */
pid_t ps_oppid; /* Save parent pid during ptrace. */
int ps_ptmask; /* Ptrace event mask */
struct ptrace_state *ps_ptstat;/* Ptrace state */