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 */