On 02/01/21(Sat) 21:54, Vitaliy Makkoveev wrote:
> This allows us to unlock getppid(2). Also NetBSD, DragonflyBSD and OSX
> do the same.

Seems the way to go, two comments below.

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

Should the parent pid be changed when a process is re-parented when
being traced?  It seems that both Free and Net only change it when a
process is re-arented to process 1 (init).

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

Can't we re-use `ps_oppid' and always cache it?  It seems that FreeBSD
is doing something like that.  Could this field be documented to make it
clear why geppid(2) can be unlocked?

>       int     ps_ptmask;              /* Ptrace event mask */
>       struct  ptrace_state *ps_ptstat;/* Ptrace state */
> 

Reply via email to