diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2026-06-08 22:46:32 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2026-06-08 22:49:51 +0000 |
| commit | 2ff705f32a2033201a8f83f1ade5ddbc0460387d (patch) | |
| tree | db203fd84f8cb042190b704d9531f143dca0b989 | |
| parent | c491c2db2f37399eba7a356c4bfa298d64012101 (diff) | |
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
| -rw-r--r-- | sys/netinet/libalias/alias_db.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c index 41f0a328daec..bc567ad2d918 100644 --- a/sys/netinet/libalias/alias_db.c +++ b/sys/netinet/libalias/alias_db.c @@ -33,6 +33,7 @@ #include <sys/systm.h> #include <sys/lock.h> #include <sys/module.h> +#include <sys/mutex.h> #include <sys/rwlock.h> #include <sys/stdarg.h> #include <sys/syslog.h> @@ -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; @@ -2191,7 +2196,13 @@ LibAliasInit(struct libalias *la) 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; @@ -2260,7 +2271,13 @@ LibAliasUninit(struct libalias *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); |
