summaryrefslogtreecommitdiffstats
path: root/src/responder/nss/nsssrv_mmap_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/responder/nss/nsssrv_mmap_cache.c')
-rw-r--r--src/responder/nss/nsssrv_mmap_cache.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c
index ab9e769b1..62f4c543c 100644
--- a/src/responder/nss/nsssrv_mmap_cache.c
+++ b/src/responder/nss/nsssrv_mmap_cache.c
@@ -31,8 +31,8 @@
#define SSS_AVG_PASSWD_PAYLOAD (MC_SLOT_SIZE * 4)
/* short group name and no gids (private user group */
#define SSS_AVG_GROUP_PAYLOAD (MC_SLOT_SIZE * 3)
-/* average place for 40 supplementary groups */
-#define SSS_AVG_INITGROUP_PAYLOAD (MC_SLOT_SIZE * 4)
+/* average place for 40 supplementary groups + 2 names */
+#define SSS_AVG_INITGROUP_PAYLOAD (MC_SLOT_SIZE * 5)
#define MC_NEXT_BARRIER(val) ((((val) + 1) & 0x00ffffff) | 0xf0000000)
@@ -965,6 +965,7 @@ done:
errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc,
struct sized_string *name,
+ struct sized_string *unique_name,
uint32_t num_groups,
uint8_t *gids_buf)
{
@@ -973,6 +974,7 @@ errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc,
struct sss_mc_initgr_data *data;
size_t data_len;
size_t rec_len;
+ size_t pos;
int ret;
if (mcc == NULL) {
@@ -980,20 +982,22 @@ errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc,
return EINVAL;
}
- /* array of gids + name */
- data_len = num_groups * sizeof(uint32_t) + name->len;
+ /* array of gids + name + unique_name */
+ data_len = num_groups * sizeof(uint32_t) + name->len + unique_name->len;
rec_len = sizeof(struct sss_mc_rec) + sizeof(struct sss_mc_initgr_data)
+ data_len;
if (rec_len > mcc->dt_size) {
return ENOMEM;
}
- ret = sss_mc_get_record(_mcc, rec_len, name, &rec);
+ /* use unique name for searching potential old records */
+ ret = sss_mc_get_record(_mcc, rec_len, unique_name, &rec);
if (ret != EOK) {
return ret;
}
data = (struct sss_mc_initgr_data *)rec->data;
+ pos = 0;
MC_RAISE_BARRIER(rec);
@@ -1001,16 +1005,22 @@ errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc,
* Use the first key twice.
*/
sss_mmap_set_rec_header(mcc, rec, rec_len, mcc->valid_time_slot,
- name->str, name->len, name->str, name->len);
+ name->str, name->len,
+ unique_name->str, unique_name->len);
/* initgroups struct */
- data->strs_len = name->len;
+ data->strs_len = name->len + unique_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->strs = data->name = MC_PTR_DIFF(&data->gids[num_groups], data);
+ memcpy((char *)data->gids + pos, gids_buf, num_groups * sizeof(uint32_t));
+ pos += num_groups * sizeof(uint32_t);
+
+ memcpy((char *)data->gids + pos, unique_name->str, unique_name->len);
+ data->strs = data->unique_name = MC_PTR_DIFF((char *)data->gids + pos, data);
+ pos += unique_name->len;
+
+ memcpy((char *)data->gids + pos, name->str, name->len);
+ data->name = MC_PTR_DIFF((char *)data->gids + pos, data);
MC_LOWER_BARRIER(rec);