Justus Winter, le Fri 08 Nov 2013 21:24:16 +0100, a écrit :
> If we have to create a new process group, we have to do this before
> leaving the current one. The current process group is deallocated if
> the process is the last process in that group. Likewise, if the
> current group was the last group in the current groups session, the
> session is deallocated.
>
> Found using the Clang Static Analyzer.
Ack.
> * proc/pgrp.c (S_proc_setpgrp): Fix use-after-free error.
> ---
> proc/pgrp.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/proc/pgrp.c b/proc/pgrp.c
> index d4ea9ee..a828e17 100644
> --- a/proc/pgrp.c
> +++ b/proc/pgrp.c
> @@ -341,8 +341,14 @@ S_proc_setpgrp (struct proc *callerp,
>
> if (p->p_pgrp != pg)
> {
> + /* If we have to create a new pgrp, we have to do this before
> + leaving the current one. p->p_pgrp is deallocated if p is
> + the last process in that group. Likewise, if p->p_pgrp was
> + the last group in p->p_pgrp->pg_session, the session is
> + deallocated. */
> + struct pgrp *new = pg ? pg : new_pgrp (pgid, p->p_pgrp->pg_session);
> leave_pgrp (p);
> - p->p_pgrp = pg ? pg : new_pgrp (pgid, p->p_pgrp->pg_session);
> + p->p_pgrp = new;
> join_pgrp (p);
> }
> else
> --
> 1.7.10.4
>
>
--
Samuel
X-Favorit-Cartoon: Calvin and Hobbes
-+- Mail header of Wim van Dorst -+-