diff --git a/sys/netlink/netlink_generic.c b/sys/netlink/netlink_generic.c --- a/sys/netlink/netlink_generic.c +++ b/sys/netlink/netlink_generic.c @@ -133,6 +133,23 @@ free(gf->family_cmds, M_NETLINK); } +/* + * unregister groups of a given family + */ +static void +unregister_group(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; + break; + } + } +} + /* * Can sleep, I guess */ @@ -148,6 +165,7 @@ if (gf != NULL) { found = true; + unregister_group(gf); /* TODO: zero pointer first */ free_family(gf); bzero(gf, sizeof(*gf));