From 2ff705f32a2033201a8f83f1ade5ddbc0460387d Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Mon, 8 Jun 2026 22:46:32 +0000 Subject: [PATCH] libalias: Serialize updates to the global instance list libalias maintains a global list of all libalias handles. The list was updated without any locking, but nothing prevents updates from running concurrently. MFC after: 1 week --- sys/netinet/libalias/alias_db.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c index 41f0a328dae..bc567ad2d91 100644 --- a/sys/netinet/libalias/alias_db.c +++ b/sys/netinet/libalias/alias_db.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -61,6 +62,10 @@ #include "alias_db.h" +#ifdef _KERNEL +static struct mtx list_mtx; +MTX_SYSINIT(libalias_list, &list_mtx, "libalias list lock", MTX_DEF); +#endif static LIST_HEAD(, libalias) instancehead = LIST_HEAD_INITIALIZER(instancehead); int LibAliasTime; @@ -2190,8 +2195,14 @@ LibAliasInit(struct libalias *la) /* kernel cleans up on module unload */ if (LIST_EMPTY(&instancehead)) atexit(finishoff); +#endif +#ifdef _KERNEL + mtx_lock(&list_mtx); #endif LIST_INSERT_HEAD(&instancehead, la, instancelist); +#ifdef _KERNEL + mtx_unlock(&list_mtx); +#endif #ifdef _KERNEL LibAliasTime = time_uptime; @@ -2259,8 +2270,14 @@ LibAliasUninit(struct libalias *la) UninitPacketAliasLog(la); #ifndef NO_FW_PUNCH UninitPunchFW(la); +#endif +#ifdef _KERNEL + mtx_lock(&list_mtx); #endif LIST_REMOVE(la, instancelist); +#ifdef _KERNEL + mtx_unlock(&list_mtx); +#endif LIBALIAS_UNLOCK(la); LIBALIAS_LOCK_DESTROY(la); free(la);