Re: [PATCH 8/9] EDAC/versalnet: Fix use-after-free in remove_one_mc()

"Pandey, Radhey Shyam" <[email protected]> Fri, 31 Jul 2026 19:36:52 +0530
Newsgroups org.kernel.vger.linux-edac,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 7/24/2026 10:49 PM, Shubhrajyoti Datta wrote:
> device_unregister() drops the last reference on the device and invokes
> versal_edac_release() which calls kfree(dev). The subsequent call to
> edac_mc_del_mc(mci->pdev) then dereferences the freed pointer.
> 
> Fix by saving the device pointer, calling edac_mc_del_mc() and
> edac_mc_free() first, then device_unregister() last so the device
> is freed only after all users are done with it.
> 
> Fixes: 62a9fc50e8d9 ("EDAC/versalnet: Refactor memory controller initialization and cleanup")
> Cc: [email protected]
> Signed-off-by: Shubhrajyoti Datta <[email protected]>


Reviewed-by: Radhey Shyam Pandey <[email protected]>
Thanks!> ---
> 
>   drivers/edac/versalnet_edac.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/edac/versalnet_edac.c b/drivers/edac/versalnet_edac.c
> index baca90f44c58..ba295714d972 100644
> --- a/drivers/edac/versalnet_edac.c
> +++ b/drivers/edac/versalnet_edac.c
> @@ -763,14 +763,16 @@ static void versal_edac_release(struct device *dev)
>   static void remove_one_mc(struct mc_priv *priv, int i)
>   {
>   	struct mem_ctl_info *mci;
> +	struct device *dev;
>   
>   	mci = priv->mci[i];
>   	if (!mci)
>   		return;
>   
> -	device_unregister(mci->pdev);
> -	edac_mc_del_mc(mci->pdev);
> +	dev = mci->pdev;
> +	edac_mc_del_mc(dev);
>   	edac_mc_free(mci);
> +	device_unregister(dev);
>   }
>   
>   static int init_one_mc(struct mc_priv *priv, int i)