[PATCH v2 2/2] fix eal/freebsd: unregister alarm callback before free
Rui Ferreira
rui.ferreira1 at h-partners.com
Fri May 30 10:18:44 CEST 2025
Unregister callback on cleanup to avoid use after free from the
interrupt thread (eal_intr_thread_main).
To be more defensive, set ptr to NULL if we can unregister.
rte_intr_callback_unregister_sync may (optionally) use traces
so the alarm cleanup must happen before eal_trace_fini to avoid
accessing freed memory.
Bugzilla ID: 1683
Signed-off-by: Rui Ferreira <rui.ferreira1 at h-partners.com>
---
lib/eal/freebsd/eal.c | 3 ++-
lib/eal/freebsd/eal_alarm.c | 8 +++++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index d6fffa2170..21ce4e6b18 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -907,8 +907,9 @@ rte_eal_cleanup(void)
rte_mp_channel_cleanup();
eal_bus_cleanup();
rte_trace_save();
- eal_trace_fini();
+ /* may use trace, must be called before eal_trace_fini */
rte_eal_alarm_cleanup();
+ eal_trace_fini();
/* after this point, any DPDK pointers will become dangling */
rte_eal_memory_detach();
eal_cleanup_config(internal_conf);
diff --git a/lib/eal/freebsd/eal_alarm.c b/lib/eal/freebsd/eal_alarm.c
index 28f285fdef..c03e281e67 100644
--- a/lib/eal/freebsd/eal_alarm.c
+++ b/lib/eal/freebsd/eal_alarm.c
@@ -50,7 +50,13 @@ static void eal_alarm_callback(void *arg);
void
rte_eal_alarm_cleanup(void)
{
- rte_intr_instance_free(intr_handle);
+ /* unregister callback using intr_handle in interrupt thread */
+ int ret = rte_intr_callback_unregister_sync(intr_handle,
+ eal_alarm_callback, (void *)-1);
+ if (ret >= 0) {
+ rte_intr_instance_free(intr_handle);
+ intr_handle = NULL;
+ }
}
int
--
2.43.0
More information about the dev
mailing list