Re: [PATCH net] netdevsim: take bus device refcount before registering device

From: Jakub Kicinski

Date: Tue Sep 01 2026 - 20:06:31 EST


On Mon, 31 Aug 2026 14:39:52 -0400 Adriano Cordova wrote:
> nsim_bus_dev_release() drops nsim_bus_devs when a device is freed, but
> the matching increment was done in new_device_store() only after
> nsim_bus_dev_new() returned successfully. When device_register() failed
> inside nsim_bus_dev_new(), put_device() invoked the release callback and
> decremented nsim_bus_devs without the increment, driving the refcount to
> zero. A later successful device creation then incremented from zero and
> triggered:
>
> refcount_t: addition on 0; use-after-free.
>
> Increment nsim_bus_devs in nsim_bus_dev_new() before device_register() so
> the release callback's decrement is balanced on both the success and error
> paths.

This is still racy, please squash this into v2:

@@ -520,8 +520,6 @@ void nsim_bus_exit(void)

/* Disallow using resources */
smp_store_release(&nsim_bus_enable, false);
- if (refcount_dec_and_test(&nsim_bus_devs))
- complete(&nsim_bus_devs_released);

mutex_lock(&nsim_bus_dev_list_lock);
list_for_each_entry_safe(nsim_bus_dev, tmp, &nsim_bus_dev_list, list) {
@@ -530,6 +528,9 @@ void nsim_bus_exit(void)
}
mutex_unlock(&nsim_bus_dev_list_lock);

+ if (refcount_dec_and_test(&nsim_bus_devs))
+ complete(&nsim_bus_devs_released);
+
wait_for_completion(&nsim_bus_devs_released);

driver_unregister(&nsim_driver);
--
pw-bot: cr