Re: [PATCH RFC] netdevsim: remove debugfs files before freeing netdev

Aleksandr Nogikh <[email protected]>
Newsgroups dev.linux.lists.syzbot
Message-ID <CANp29Y4KzjjKukZeXfhm8AD+Pv7tkT=u3JqnLr93XyW1wc5+TA@mail.gmail.com>
Should we explicitly save the debugfs folder pointer and call
debugfs_remove_recursive on nsim_destroy?
Cleanup should be symmetrical to resource creation.

On Fri, Jun 19, 2026 at 11:16 AM 'syzbot' via
syzkaller-upstream-moderation
<[email protected]> wrote:
>
> A KASAN slab-use-after-free bug was detected in debugfs_u32_get(). The root
> cause is a race condition between the destruction of a netdevsim port and
> the cleanup of its associated debugfs files.
>
> When a netdevsim port is destroyed, the teardown happens in
> __nsim_dev_port_del(), which first calls nsim_destroy() and then
> nsim_dev_port_debugfs_exit(). nsim_destroy() eventually calls
> free_netdev(), which frees the struct netdevsim memory. However, the
> debugfs files pointing to fields inside this struct are only removed later
> in nsim_dev_port_debugfs_exit(). This creates a use-after-free window where
> a user space program can access the freed memory by reading from the
> debugfs files. The same issue exists in the error path of nsim_create().
>
> To fix this, ensure that the debugfs directory nsim_dev_port->ddir is
> recursively removed before the struct netdevsim memory is freed. Move the
> debugfs_remove_recursive() call to the beginning of nsim_destroy() and the
> error path of nsim_create(). Set nsim_dev_port->ddir to NULL to make the
> subsequent call to nsim_dev_port_debugfs_exit() a safe no-op. Finally,
> remove redundant debugfs_remove() calls for individual files and
> subdirectories, as they are now handled by the recursive removal.
>
> BUG: KASAN: slab-use-after-free in debugfs_u32_get+0x6c/0x70
> fs/debugfs/file.c:657
> Read of size 4 at addr ffff88810cd6db00 by task syz.3.8220/23584
>
> Call Trace:
>  debugfs_u32_get+0x6c/0x70 fs/debugfs/file.c:657
>  simple_attr_read+0x227/0x490 fs/libfs.c:1368
>  debugfs_attr_read+0x76/0x130 fs/debugfs/file.c:523
>  vfs_read+0x213/0xa80 fs/read_write.c:572
>  ksys_read+0x150/0x270 fs/read_write.c:717
>
> Freed by task 22896:
>  kfree+0x1c5/0x640 mm/slub.c:6566
>  device_release+0xc4/0x1f0 drivers/base/core.c:-1
>  kobject_cleanup lib/kobject.c:689 [inline]
>  kobject_release lib/kobject.c:720 [inline]
>  kref_put include/linux/kref.h:65 [inline]
>  kobject_put+0x222/0x550 lib/kobject.c:737
>  __nsim_dev_port_del+0x14e/0x200 drivers/net/netdevsim/dev.c:1547
>  nsim_dev_port_del_all drivers/net/netdevsim/dev.c:1561 [inline]
>  nsim_dev_reload_destroy+0x288/0x490 drivers/net/netdevsim/dev.c:1785
>
> Fixes: e05b2d141fef ("netdevsim: move netdev creation/destruction to dev probe")
> Assisted-by: Gemini:gemini-3.1-pro-preview syzbot
> Reported-by: [email protected]
> Closes: https://syzkaller.appspot.com/bug?extid=6c25f4750230faf70be9
> Link: https://syzkaller.appspot.com/ai_job?id=b0e49fe8-9a07-4af6-b52c-12fa3167dd55
> To: "Andrew Lunn" <[email protected]>
> To: "David S. Miller" <[email protected]>
> To: "Eric Dumazet" <[email protected]>
> To: "Jakub Kicinski" <[email protected]>
> To: <[email protected]>
> To: "Paolo Abeni" <[email protected]>
> Cc: <[email protected]>
>
> ---
> diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
> index f00fc2f9e..3a79cef66 100644
> --- a/drivers/net/netdevsim/dev.c
> +++ b/drivers/net/netdevsim/dev.c
> @@ -442,6 +442,7 @@ static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev,
>  static void nsim_dev_port_debugfs_exit(struct nsim_dev_port *nsim_dev_port)
>  {
>         debugfs_remove_recursive(nsim_dev_port->ddir);
> +       nsim_dev_port->ddir = NULL;
>  }
>
>  static int nsim_dev_resources_register(struct devlink *devlink)
> diff --git a/drivers/net/netdevsim/ipsec.c b/drivers/net/netdevsim/ipsec.c
> index 36a1be492..0bc9f42a5 100644
> --- a/drivers/net/netdevsim/ipsec.c
> +++ b/drivers/net/netdevsim/ipsec.c
> @@ -292,5 +292,4 @@ void nsim_ipsec_teardown(struct netdevsim *ns)
>         if (ipsec->count)
>                 netdev_err(ns->netdev, "tearing down IPsec offload with %d SAs left\n",
>                            ipsec->count);
> -       debugfs_remove_recursive(ipsec->pfile);
>  }
> diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
> index a75076891..91e92456f 100644
> --- a/drivers/net/netdevsim/netdev.c
> +++ b/drivers/net/netdevsim/netdev.c
> @@ -1164,6 +1164,8 @@ struct netdevsim *nsim_create(struct nsim_dev *nsim_dev,
>         return ns;
>
>  err_free_netdev:
> +       debugfs_remove_recursive(nsim_dev_port->ddir);
> +       nsim_dev_port->ddir = NULL;
>         free_netdev(dev);
>         return ERR_PTR(err);
>  }
> @@ -1174,9 +1176,8 @@ void nsim_destroy(struct netdevsim *ns)
>         struct netdevsim *peer;
>         u16 vid;
>
> -       debugfs_remove(ns->vlan_dfs);
> -       debugfs_remove(ns->qr_dfs);
> -       debugfs_remove(ns->pp_dfs);
> +       debugfs_remove_recursive(ns->nsim_dev_port->ddir);
> +       ns->nsim_dev_port->ddir = NULL;
>
>         if (ns->nb.notifier_call)
>                 unregister_netdevice_notifier_dev_net(ns->netdev, &ns->nb,
> diff --git a/drivers/net/netdevsim/psp.c b/drivers/net/netdevsim/psp.c
> index 6936ecb81..2f27a2114 100644
> --- a/drivers/net/netdevsim/psp.c
> +++ b/drivers/net/netdevsim/psp.c
> @@ -227,7 +227,6 @@ static void __nsim_psp_uninit(struct netdevsim *ns, bool teardown)
>
>  void nsim_psp_uninit(struct netdevsim *ns)
>  {
> -       debugfs_remove(ns->psp.rereg);
>         mutex_destroy(&ns->psp.rereg_lock);
>         __nsim_psp_uninit(ns, true);
>  }
> diff --git a/drivers/net/netdevsim/udp_tunnels.c b/drivers/net/netdevsim/udp_tunnels.c
> index 89fff76e5..e9cdfe817 100644
> --- a/drivers/net/netdevsim/udp_tunnels.c
> +++ b/drivers/net/netdevsim/udp_tunnels.c
> @@ -190,7 +190,6 @@ void nsim_udp_tunnels_info_destroy(struct net_device *dev)
>  {
>         struct netdevsim *ns = netdev_priv(dev);
>
> -       debugfs_remove_recursive(ns->udp_ports.ddir);
>         kfree(dev->udp_tunnel_nic_info);
>         dev->udp_tunnel_nic_info = NULL;
>  }
>
>
> base-commit: 8cd9520d35a6c38db6567e97dd93b1f11f185dc6
> --
> This is an AI-generated patch subject to moderation.
> Reply with '#syz upstream' to Sign-off the patch as a human author
> and send it to the upstream kernel mailing lists.
> Reply with '#syz reject' to reject it ('#syz unreject' to undo).
>
> See https://goo.gle/syzbot-ai-patches for information about AI-generated patches.
> You can comment on the patch as usual, syzbot will try to address
> the comments and send a new version of the patch if necessary.
> syzbot engineers can be reached at [email protected].
>
> --
> You received this message because you are subscribed to the Google Groups "syzkaller-upstream-moderation" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
> To view this discussion visit https://groups.google.com/d/msgid/syzkaller-upstream-moderation/b2de6fa2-bc67-45a6-abb0-35868b40b0da%40mail.kernel.org.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.