diff options
author | Lukas Slebodnik <lslebodn@redhat.com> | 2015-07-16 17:00:12 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2015-08-05 11:28:19 +0200 |
commit | 225dc6914cdc8920b02a129b98ece1ed97b99c03 (patch) | |
tree | 39ef3e048f6460b4f70001197e25b1b8d14b4193 /src/responder | |
parent | 39b31427e2d11ca318df11fd48db33a7cc610aa7 (diff) | |
download | sssd-225dc6914cdc8920b02a129b98ece1ed97b99c03.tar.gz sssd-225dc6914cdc8920b02a129b98ece1ed97b99c03.tar.xz sssd-225dc6914cdc8920b02a129b98ece1ed97b99c03.zip |
mmap_cache: "Override" functions for initgr mmap cache
Functions sss_mc_get_strs_offset and sss_mc_get_strs_len provides
data about strings for individual memory caches (passwd, ...)
Their are used in generic responder mmap cache code to find a record
in mmap cache (sss_mc_find_record). Data provided from functions sss_mc_get_*
are used for checking the validity of record. So in case of corrupted record
the whole mmap cache can be invalidated.
Functions sss_mc_get_strs_offset and sss_mc_get_strs_len did not provide
data for initgroups mmap cache and therefore particular record could not be
invalidated.
Resolves:
https://fedorahosted.org/sssd/ticket/2716
Reviewed-by: Michal Židek <mzidek@redhat.com>
Diffstat (limited to 'src/responder')
-rw-r--r-- | src/responder/nss/nsssrv_mmap_cache.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c index 16bc926f3..ab9e769b1 100644 --- a/src/responder/nss/nsssrv_mmap_cache.c +++ b/src/responder/nss/nsssrv_mmap_cache.c @@ -475,6 +475,9 @@ static errno_t sss_mc_get_strs_offset(struct sss_mc_ctx *mcc, case SSS_MC_GROUP: *_offset = offsetof(struct sss_mc_grp_data, strs); return EOK; + case SSS_MC_INITGROUPS: + *_offset = offsetof(struct sss_mc_initgr_data, gids); + return EOK; default: DEBUG(SSSDBG_FATAL_FAILURE, "Unknown memory cache type.\n"); return EINVAL; @@ -492,6 +495,9 @@ static errno_t sss_mc_get_strs_len(struct sss_mc_ctx *mcc, case SSS_MC_GROUP: *_len = ((struct sss_mc_grp_data *)&rec->data)->strs_len; return EOK; + case SSS_MC_INITGROUPS: + *_len = ((struct sss_mc_initgr_data *)&rec->data)->data_len; + return EOK; default: DEBUG(SSSDBG_FATAL_FAILURE, "Unknown memory cache type.\n"); return EINVAL; @@ -974,8 +980,8 @@ errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc, return EINVAL; } - /* num_groups + reserved + array of gids + name*/ - data_len = (2 + num_groups) * sizeof(uint32_t) + name->len; + /* array of gids + name */ + data_len = num_groups * sizeof(uint32_t) + name->len; rec_len = sizeof(struct sss_mc_rec) + sizeof(struct sss_mc_initgr_data) + data_len; if (rec_len > mcc->dt_size) { @@ -998,10 +1004,13 @@ errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc, name->str, name->len, name->str, name->len); /* initgroups struct */ + data->strs_len = name->len; + data->data_len = data_len; + data->reserved = MC_INVALID_VAL32; data->num_groups = num_groups; memcpy(data->gids, gids_buf, num_groups * sizeof(uint32_t)); memcpy(&data->gids[num_groups], name->str, name->len); - data->name = MC_PTR_DIFF(&data->gids[num_groups], data); + data->strs = data->name = MC_PTR_DIFF(&data->gids[num_groups], data); MC_LOWER_BARRIER(rec); |