Signed-off-by: Doug Nazar <nazard@xxxxxxxx> --- support/nfsidmap/libnfsidmap.c | 13 +++++++++++++ support/nfsidmap/nfsidmap.h | 1 + support/nfsidmap/nfsidmap_common.c | 11 ++++++++++- support/nfsidmap/nfsidmap_private.h | 1 + support/nfsidmap/nss.c | 8 ++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/support/nfsidmap/libnfsidmap.c b/support/nfsidmap/libnfsidmap.c index bce448cf..6b5647d2 100644 --- a/support/nfsidmap/libnfsidmap.c +++ b/support/nfsidmap/libnfsidmap.c @@ -496,6 +496,19 @@ out: return ret ? -ENOENT: 0; } +void nfs4_term_name_mapping(void) +{ + if (nfs4_plugins) + unload_plugins(nfs4_plugins); + if (gss_plugins) + unload_plugins(gss_plugins); + + nfs4_plugins = gss_plugins = NULL; + + free_local_realms(); + conf_cleanup(); +} + int nfs4_get_default_domain(char *UNUSED(server), char *domain, size_t len) { diff --git a/support/nfsidmap/nfsidmap.h b/support/nfsidmap/nfsidmap.h index 10630654..5a795684 100644 --- a/support/nfsidmap/nfsidmap.h +++ b/support/nfsidmap/nfsidmap.h @@ -50,6 +50,7 @@ typedef struct _extra_mapping_params { typedef void (*nfs4_idmap_log_function_t)(const char *, ...); int nfs4_init_name_mapping(char *conffile); +void nfs4_term_name_mapping(void); int nfs4_get_default_domain(char *server, char *domain, size_t len); int nfs4_uid_to_name(uid_t uid, char *domain, char *name, size_t len); int nfs4_gid_to_name(gid_t gid, char *domain, char *name, size_t len); diff --git a/support/nfsidmap/nfsidmap_common.c b/support/nfsidmap/nfsidmap_common.c index f89b82ee..4d2cb14f 100644 --- a/support/nfsidmap/nfsidmap_common.c +++ b/support/nfsidmap/nfsidmap_common.c @@ -34,12 +34,21 @@ static char * toupper_str(char *s) return s; } +static struct conf_list *local_realms = NULL; + +void free_local_realms(void) +{ + if (local_realms) { + conf_free_list(local_realms); + local_realms = NULL; + } +} + /* Get list of "local equivalent" realms. Meaning the list of realms * where john@REALM.A is considered the same user as john@REALM.B * If not specified, default to upper-case of local domain name */ struct conf_list *get_local_realms(void) { - static struct conf_list *local_realms = NULL; if (local_realms) return local_realms; local_realms = conf_get_list("General", "Local-Realms"); diff --git a/support/nfsidmap/nfsidmap_private.h b/support/nfsidmap/nfsidmap_private.h index f1af55fa..a5cb6dda 100644 --- a/support/nfsidmap/nfsidmap_private.h +++ b/support/nfsidmap/nfsidmap_private.h @@ -37,6 +37,7 @@ #include "conffile.h" struct conf_list *get_local_realms(void); +void free_local_realms(void); int get_nostrip(void); int get_reformat_group(void); diff --git a/support/nfsidmap/nss.c b/support/nfsidmap/nss.c index 9d46499c..f8dbb94a 100644 --- a/support/nfsidmap/nss.c +++ b/support/nfsidmap/nss.c @@ -467,6 +467,14 @@ static int nss_plugin_init(void) return 0; } +__attribute__((destructor)) +static int nss_plugin_term(void) +{ + free_local_realms(); + conf_cleanup(); + return 0; +} + struct trans_func nss_trans = { .name = "nsswitch", -- 2.26.2