summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Slebodnik <lslebodn@redhat.com>2015-06-30 14:16:47 +0200
committerJakub Hrozek <jhrozek@redhat.com>2015-07-03 15:16:52 +0200
commit6d292632a7176540dd317bba7457a12a3634789a (patch)
treecdd49b42dd91b569ff380b736811b8b108425a72
parentebf6735dd4f71bf3dc9105e5d04d11e744c64a59 (diff)
downloadsssd-6d292632a7176540dd317bba7457a12a3634789a.tar.gz
sssd-6d292632a7176540dd317bba7457a12a3634789a.tar.xz
sssd-6d292632a7176540dd317bba7457a12a3634789a.zip
mmap_cache: Invalidate entry in right memory cache
If group was not found in nss_cmd_getgrnam_search then we tied to invalidate entry in memory cache. But function delete_entry_from_memory cache only invalidated in passwd memory cache. Reviewed-by: Michal Židek <mzidek@redhat.com>
-rw-r--r--src/responder/nss/nsssrv_cmd.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index ccb8e7334..b163d6d57 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -753,7 +753,8 @@ static void nsssrv_dp_send_acct_req_done(struct tevent_req *req)
}
static int delete_entry_from_memcache(struct sss_domain_info *dom, char *name,
- struct sss_mc_ctx *mc_ctx)
+ struct sss_mc_ctx *mc_ctx,
+ enum sss_mc_type type)
{
TALLOC_CTX *tmp_ctx = NULL;
struct sized_string delete_name;
@@ -778,11 +779,27 @@ static int delete_entry_from_memcache(struct sss_domain_info *dom, char *name,
to_sized_string(&delete_name, name);
}
- ret = sss_mmap_cache_pw_invalidate(mc_ctx, &delete_name);
- if (ret != EOK && ret != ENOENT) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Internal failure in memory cache code: %d [%s]\n",
- ret, strerror(ret));
+ switch (type) {
+ case SSS_MC_PASSWD:
+ ret = sss_mmap_cache_pw_invalidate(mc_ctx, &delete_name);
+ if (ret != EOK && ret != ENOENT) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Internal failure in memory cache code: %d [%s]\n",
+ ret, strerror(ret));
+ goto done;
+ }
+ break;
+ case SSS_MC_GROUP:
+ ret = sss_mmap_cache_gr_invalidate(mc_ctx, &delete_name);
+ if (ret != EOK && ret != ENOENT) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Internal failure in memory cache code: %d [%s]\n",
+ ret, strerror(ret));
+ goto done;
+ }
+ break;
+ default:
+ ret = EINVAL;
goto done;
}
@@ -944,7 +961,7 @@ static int nss_cmd_getpwnam_search(struct nss_dom_ctx *dctx)
/* User not found in ldb -> delete user from memory cache. */
ret = delete_entry_from_memcache(dctx->domain, name,
- nctx->pwd_mc_ctx);
+ nctx->pwd_mc_ctx, SSS_MC_PASSWD);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
"Deleting user from memcache failed.\n");
@@ -3064,7 +3081,7 @@ static int nss_cmd_getgrnam_search(struct nss_dom_ctx *dctx)
/* Group not found in ldb -> delete group from memory cache. */
ret = delete_entry_from_memcache(dctx->domain, name,
- nctx->grp_mc_ctx);
+ nctx->grp_mc_ctx, SSS_MC_GROUP);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
"Deleting group from memcache failed.\n");