git: 1edc3b6e5693 - main - netlink: unregister groups along with family

From: Baptiste Daroussin <bapt_at_FreeBSD.org>
Date: Tue, 08 Nov 2022 11:47:58 UTC
The branch main has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=1edc3b6e56932e423d778df484ffca3bd2af9e97

commit 1edc3b6e56932e423d778df484ffca3bd2af9e97
Author:     Baptiste Daroussin <bapt@FreeBSD.org>
AuthorDate: 2022-11-08 08:02:43 +0000
Commit:     Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2022-11-08 11:46:58 +0000

    netlink: unregister groups along with family
    
    Differential Revision:  https://reviews.freebsd.org/D37308
    Reviewed by:    melifaro
---
 sys/netlink/netlink_generic.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/sys/netlink/netlink_generic.c b/sys/netlink/netlink_generic.c
index de45048ff519..267024dfee4b 100644
--- a/sys/netlink/netlink_generic.c
+++ b/sys/netlink/netlink_generic.c
@@ -133,6 +133,22 @@ free_family(struct genl_family *gf)
 		free(gf->family_cmds, M_NETLINK);
 }
 
+/*
+ * unregister groups of a given family
+ */
+static void
+unregister_groups(const struct genl_family *gf)
+{
+
+	for (int i = 0; i < MAX_GROUPS; i++) {
+		struct genl_group *gg = &groups[i];
+		if (gg->group_family == gf && gg->group_name != NULL) {
+			gg->group_family = NULL;
+			gg->group_name = NULL;
+		}
+	}
+}
+
 /*
  * Can sleep, I guess
  */
@@ -148,6 +164,7 @@ genl_unregister_family(const char *family_name)
 
 	if (gf != NULL) {
 		found = true;
+		unregister_groups(gf);
 		/* TODO: zero pointer first */
 		free_family(gf);
 		bzero(gf, sizeof(*gf));