The branch main has been updated by bapt:

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

commit 1edc3b6e56932e423d778df484ffca3bd2af9e97
Author:     Baptiste Daroussin <[email protected]>
AuthorDate: 2022-11-08 08:02:43 +0000
Commit:     Baptiste Daroussin <[email protected]>
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));

Reply via email to