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

Reply via email to