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