summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorSicong Huang <congei42@163.com>2026-10-24 12:49:03 +0800
committerDave Miller <davem@davem-thinkpadp1gen8.ibmlond.csb>2026-10-28 10:09:46 +0000
commit083aaafd453c3fb14411519d6ada9a8917573fdb (patch)
tree6b3e12e495d76c7a29c246d840b141c86643d2e2 /scripts
parent1e860f42f41c6fbf3304f6a52be38245b9394982 (diff)
nfp: flower: fix use-after-free in neighbour update work
The netevent notifier handles neighbour updates and redirects by queuing nfp_tun_neigh_update() on system_highpri_wq. Each work item holds a reference to the neighbour, but only stores a pointer to the flower app. During device removal, nfp_tunnel_config_stop() unregisters the notifier. This waits for notifier callbacks to return, but does not wait for the work they queued. The teardown then frees app->priv and app without waiting for these work items. Flushing cmsg_work in nfp_flower_clean() does not cover the neighbour update work. A pending work item can therefore run after the app has been freed. Its call to nfp_flower_get_port_id_from_netdev() can then access freed memory while checking whether the neighbour's device can be offloaded. Even notifications for unrelated devices can reach this check. The same problem affects shutdown and probe error paths that tear down the app after the netevent notifier has been registered. One possible interleaving is shown below. The neighbour belongs to another network device that remains registered. CPU0 (remove) CPU1 (notifier / kworker) nfp_tun_neigh_event_handler() queue_work(system_highpri_wq, ...) return /* Work has not run yet. */ nfp_tunnel_config_stop() unregister_netevent_notifier() /* Notifier callbacks have finished, but work may be pending. */ nfp_flower_clean() vfree(app->priv) app->priv = NULL nfp_app_free() kfree(app) nfp_tun_neigh_update() app = update_work->app nfp_flower_get_port_id_from_netdev() app->priv /* use-after-free */ The work items are allocated per event and free themselves, so they cannot be cancelled individually, and flushing system_highpri_wq is not allowed. Use a dedicated workqueue for neighbour updates instead. In nfp_tunnel_config_stop(), unregister the notifier and destroy the workqueue before cleaning up the tunnel state. This prevents new work from being queued and waits for pending and running work to finish while the app and its resources are still valid. Found by code inspection. Fixes: 0ad722bd9ee3 ("nfp: flower: fix for take a mutex lock in soft irq context and rcu lock") Signed-off-by: Sicong Huang <congei42@163.com> Reviewed-by: Daniel Machon <daniel.machon@microchip.com> Signed-off-by: Dave Miller <davem@davem-thinkpadp1gen8.ibmlond.csb>
Diffstat (limited to 'scripts')
0 files changed, 0 insertions, 0 deletions