On 26/05/20(Tue) 16:12, Vitaliy Makkoveev wrote:
> `pppx_if' has `pxi_ready' field used to prevent access to incomplete
> `pxi'. But we don't prevent access to `pxi' which we destroy.
> pppx_if_destroy() can sleep so we can grab `pxi' which we already
> destroying by concurrent thread and cause use-after-free issue. I guess
> to use `pxi_ready' to prevent access to `pxi' at destroy stage too.

What about setting this field as first step in pppx_if_destroy()?
 
> Index: sys/net/if_pppx.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_pppx.c,v
> retrieving revision 1.84
> diff -u -p -r1.84 if_pppx.c
> --- sys/net/if_pppx.c 18 Apr 2020 04:03:56 -0000      1.84
> +++ sys/net/if_pppx.c 26 May 2020 12:59:56 -0000
> @@ -594,8 +594,10 @@ pppxclose(dev_t dev, int flags, int mode
>  
>       /* XXX */
>       NET_LOCK();
> -     while ((pxi = LIST_FIRST(&pxd->pxd_pxis)))
> +     while ((pxi = LIST_FIRST(&pxd->pxd_pxis))) {
> +             pxi->pxi_ready = 0;
>               pppx_if_destroy(pxd, pxi);
> +     }
>       NET_UNLOCK();
>  
>       LIST_REMOVE(pxd, pxd_entry);
> @@ -951,6 +953,7 @@ pppx_del_session(struct pppx_dev *pxd, s
>       pxi = pppx_if_find(pxd, req->pcr_session_id, req->pcr_protocol);
>       if (pxi == NULL)
>               return (EINVAL);
> +     pxi->pxi_ready = 0;
>  
>       req->pcr_stat = pxi->pxi_session.stat;
>  
> 

Reply via email to