Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mmap_cache: add SID and type to struct sss_mc_rec #413

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/responder/nss/nss_private.h
Expand Up @@ -138,4 +138,10 @@ const char *
nss_get_pwfield(struct nss_ctx *nctx,
struct sss_domain_info *dom);

errno_t get_extra_data(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
const char override_space,
struct ldb_message *msg,
struct sized_data *extra_data);

#endif /* _NSS_PRIVATE_H_ */
21 changes: 18 additions & 3 deletions src/responder/nss/nss_protocol_grent.c
Expand Up @@ -202,13 +202,15 @@ nss_protocol_fill_grent(struct nss_ctx *nss_ctx,
struct sized_string *name;
struct sized_string pwfield;
struct sized_string inputname;
struct sized_data extra_data = { 0 };
uint32_t gid;
uint32_t num_results;
uint32_t num_members;
char *members;
size_t members_size;
size_t rp;
size_t rp_members;
size_t rp_members_end;
size_t rp_num_members;
size_t body_len;
uint8_t *body;
Expand Down Expand Up @@ -242,10 +244,21 @@ nss_protocol_fill_grent(struct nss_ctx *nss_ctx,
continue;
}

if (!cmd_ctx->enumeration) {
ret = get_extra_data(tmp_ctx, result->domain,
nss_ctx->rctx->override_space, msg,
&extra_data);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, "get_extra_data failed.\n");
continue;
}
}

/* Adjust packet size: gid, num_members + string fields. */

ret = sss_packet_grow(packet, 2 * sizeof(uint32_t)
+ name->len + pwfield.len);
+ name->len + pwfield.len
+ extra_data.len);
if (ret != EOK) {
goto done;
}
Expand All @@ -269,6 +282,8 @@ nss_protocol_fill_grent(struct nss_ctx *nss_ctx,
if (ret != EOK) {
goto done;
}
rp_members_end = rp;
SAFEALIGN_SET_STRING(&body[rp], extra_data.data, extra_data.len, &rp);

sss_packet_get_body(packet, &body, &body_len);
SAFEALIGN_SET_UINT32(&body[rp_num_members], num_members, NULL);
Expand All @@ -278,10 +293,10 @@ nss_protocol_fill_grent(struct nss_ctx *nss_ctx,
/* Do not store entry in memory cache during enumeration. */
if (!cmd_ctx->enumeration) {
members = (char *)&body[rp_members];
members_size = body_len - rp_members;
members_size = rp_members_end - rp_members;
ret = sss_mmap_cache_gr_store(&nss_ctx->grp_mc_ctx, name, &pwfield,
gid, num_members, members,
members_size);
members_size, &extra_data);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
"Failed to store group %s (%s) in mem-cache [%d]: %s!\n",
Expand Down
18 changes: 16 additions & 2 deletions src/responder/nss/nss_protocol_pwent.c
Expand Up @@ -237,6 +237,7 @@ nss_protocol_fill_pwent(struct nss_ctx *nss_ctx,
struct sized_string homedir;
struct sized_string shell;
struct sized_string inputname;
struct sized_data extra_data = { 0 };
uint32_t gid;
uint32_t uid;
uint32_t num_results;
Expand Down Expand Up @@ -273,11 +274,22 @@ nss_protocol_fill_pwent(struct nss_ctx *nss_ctx,
continue;
}

if (!cmd_ctx->enumeration) {
ret = get_extra_data(tmp_ctx, result->domain,
nss_ctx->rctx->override_space, msg,
&extra_data);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, "get_extra_data failed.\n");
continue;
}
}

/* Adjust packet size: uid, gid + string fields. */

ret = sss_packet_grow(packet, 2 * sizeof(uint32_t)
+ name->len + gecos.len + homedir.len
+ shell.len + pwfield.len);
+ shell.len + pwfield.len
+ extra_data.len);
if (ret != EOK) {
goto done;
}
Expand All @@ -293,13 +305,15 @@ nss_protocol_fill_pwent(struct nss_ctx *nss_ctx,
SAFEALIGN_SET_STRING(&body[rp], gecos.str, gecos.len, &rp);
SAFEALIGN_SET_STRING(&body[rp], homedir.str, homedir.len, &rp);
SAFEALIGN_SET_STRING(&body[rp], shell.str, shell.len, &rp);
SAFEALIGN_SET_STRING(&body[rp], extra_data.data, extra_data.len, &rp);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you formatting this information as an additional structure, instead of simply adding these fileds one by one in the current structure ?


num_results++;

/* Do not store entry in memory cache during enumeration. */
if (!cmd_ctx->enumeration) {
ret = sss_mmap_cache_pw_store(&nss_ctx->pwd_mc_ctx, name, &pwfield,
uid, gid, &gecos, &homedir, &shell);
uid, gid, &gecos, &homedir, &shell,
&extra_data);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
"Failed to store user %s (%s) in mmap cache [%d]: %s!\n",
Expand Down
73 changes: 73 additions & 0 deletions src/responder/nss/nss_utils.c
Expand Up @@ -36,3 +36,76 @@ nss_get_pwfield(struct nss_ctx *nctx,

return nctx->pwfield;
}

errno_t get_extra_data(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
const char override_space,
struct ldb_message *msg,
struct sized_data *extra_data)
{
const char *name;
char *short_name;
size_t len = 0;
size_t pos = 0;
uint8_t *data;
const char *flat_name;
const char *sid_str;

if (domain == NULL || domain->name == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "Missing domain name.");
return EINVAL;
}

/* Use domain->name if domain->flat_name is undefined */
/* FIXME: or should it be better "" ? */
flat_name = domain->flat_name != NULL ? domain->flat_name : domain->name;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove "!= NULL" if you are using this kind of short expression you may optimize that out as well


name = sss_get_name_from_msg(domain, msg);
if (name == NULL) {
DEBUG(SSSDBG_OP_FAILURE, "Object has no name.\n");
return EINVAL;
}

short_name = sss_output_name(mem_ctx, name, domain->case_preserve,
override_space);
if (short_name == NULL) {
DEBUG(SSSDBG_OP_FAILURE, "sss_output_name failed.\n");
return ENOMEM;
}

/* If a SID cannot be found add an empty string */
sid_str = ldb_msg_find_attr_as_string(msg, SYSDB_SID_STR, "");

len = strlen(short_name) + strlen(domain->name) + strlen(flat_name)
+ strlen(sid_str) + 4 + 2 * sizeof(uint32_t);
data = talloc_size(mem_ctx, len);
if (data == NULL) {
talloc_free(short_name);
DEBUG(SSSDBG_OP_FAILURE, "talloc_size failed.\n");
return ENOMEM;
}

/* overall length of the extra data including the length itself */
SAFEALIGN_COPY_UINT32(data + pos, &len, &pos);
/* 4 0-terminated strings will follow */
SAFEALIGN_SET_UINT32(data + pos, 4, &pos);

memcpy(data + pos, short_name, strlen(short_name) + 1);
pos += strlen(short_name) + 1;
talloc_free(short_name);

memcpy(data + pos, domain->name, strlen(domain->name) + 1);
pos += strlen(domain->name) + 1;

memcpy(data + pos, flat_name, strlen(flat_name) + 1);
pos += strlen(flat_name) + 1;

memcpy(data + pos, sid_str, strlen(sid_str) + 1);
pos += strlen(sid_str) + 1;

extra_data->data = data;
extra_data->len = len;

return EOK;
}

15 changes: 11 additions & 4 deletions src/responder/nss/nsssrv_mmap_cache.c
Expand Up @@ -756,7 +756,8 @@ errno_t sss_mmap_cache_pw_store(struct sss_mc_ctx **_mcc,
uid_t uid, gid_t gid,
struct sized_string *gecos,
struct sized_string *homedir,
struct sized_string *shell)
struct sized_string *shell,
struct sized_data *extra_data)
{
struct sss_mc_ctx *mcc = *_mcc;
struct sss_mc_rec *rec;
Expand All @@ -779,7 +780,8 @@ errno_t sss_mmap_cache_pw_store(struct sss_mc_ctx **_mcc,
}
to_sized_string(&uidkey, uidstr);

data_len = name->len + pw->len + gecos->len + homedir->len + shell->len;
data_len = name->len + pw->len + gecos->len + homedir->len + shell->len
+ extra_data->len;
rec_len = sizeof(struct sss_mc_rec) +
sizeof(struct sss_mc_pwd_data) +
data_len;
Expand Down Expand Up @@ -816,6 +818,8 @@ errno_t sss_mmap_cache_pw_store(struct sss_mc_ctx **_mcc,
pos += homedir->len;
memcpy(&data->strs[pos], shell->str, shell->len);
pos += shell->len;
memcpy(&data->strs[pos], extra_data->data, extra_data->len);
pos += extra_data->len;

MC_LOWER_BARRIER(rec);

Expand Down Expand Up @@ -899,7 +903,8 @@ int sss_mmap_cache_gr_store(struct sss_mc_ctx **_mcc,
struct sized_string *name,
struct sized_string *pw,
gid_t gid, size_t memnum,
char *membuf, size_t memsize)
char *membuf, size_t memsize,
struct sized_data *extra_data)
{
struct sss_mc_ctx *mcc = *_mcc;
struct sss_mc_rec *rec;
Expand All @@ -922,7 +927,7 @@ int sss_mmap_cache_gr_store(struct sss_mc_ctx **_mcc,
}
to_sized_string(&gidkey, gidstr);

data_len = name->len + pw->len + memsize;
data_len = name->len + pw->len + memsize + extra_data->len;
rec_len = sizeof(struct sss_mc_rec) +
sizeof(struct sss_mc_grp_data) +
data_len;
Expand Down Expand Up @@ -955,6 +960,8 @@ int sss_mmap_cache_gr_store(struct sss_mc_ctx **_mcc,
pos += pw->len;
memcpy(&data->strs[pos], membuf, memsize);
pos += memsize;
memcpy(&data->strs[pos], extra_data->data, extra_data->len);
pos += extra_data->len;

MC_LOWER_BARRIER(rec);

Expand Down
6 changes: 4 additions & 2 deletions src/responder/nss/nsssrv_mmap_cache.h
Expand Up @@ -47,13 +47,15 @@ errno_t sss_mmap_cache_pw_store(struct sss_mc_ctx **_mcc,
uid_t uid, gid_t gid,
struct sized_string *gecos,
struct sized_string *homedir,
struct sized_string *shell);
struct sized_string *shell,
struct sized_data *extra_data);

errno_t sss_mmap_cache_gr_store(struct sss_mc_ctx **_mcc,
struct sized_string *name,
struct sized_string *pw,
gid_t gid, size_t memnum,
char *membuf, size_t memsize);
char *membuf, size_t memsize,
struct sized_data *extra_data);

errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc,
struct sized_string *name,
Expand Down
8 changes: 8 additions & 0 deletions src/sss_client/idmap/sss_nss_idmap.h
Expand Up @@ -159,4 +159,12 @@ int sss_nss_getlistbycert(const char *cert, char ***fq_name,
* @param[in] kv_list Key-value list returned by sss_nss_getorigbyname().
*/
void sss_nss_free_kv(struct sss_nss_kv *kv_list);

enum extra_data_item {
EX_DATA_SHORT_NAME = 0,
EX_DATA_DOMAIN_NAME,
EX_DATA_SHORT_DOMAIN_NAME,
EX_DATA_SID_STR,
EX_DATA_END
};
#endif /* SSS_NSS_IDMAP_H_ */
20 changes: 20 additions & 0 deletions src/sss_client/nss_mc.h
Expand Up @@ -76,17 +76,37 @@ errno_t sss_nss_mc_find_rec_by_hash(struct sss_cli_mc_ctx *ctx,
errno_t sss_nss_mc_getpwnam(const char *name, size_t name_len,
struct passwd *result,
char *buffer, size_t buflen);
errno_t sss_nss_mc_getpwnam_with_extra(const char *name, size_t name_len,
struct passwd *result,
char *buffer, size_t buflen,
char **extra_data,
uint32_t *extra_data_len);
errno_t sss_nss_mc_getpwuid(uid_t uid,
struct passwd *result,
char *buffer, size_t buflen);
errno_t sss_nss_mc_getpwuid_with_extra(uid_t uid,
struct passwd *result,
char *buffer, size_t buflen,
char **extra_data,
uint32_t *extra_data_len);

/* group db */
errno_t sss_nss_mc_getgrnam(const char *name, size_t name_len,
struct group *result,
char *buffer, size_t buflen);
errno_t sss_nss_mc_getgrnam_with_extra(const char *name, size_t name_len,
struct group *result,
char *buffer, size_t buflen,
char **extra_data,
uint32_t *extra_data_len);
errno_t sss_nss_mc_getgrgid(gid_t gid,
struct group *result,
char *buffer, size_t buflen);
errno_t sss_nss_mc_getgrgid_with_extra(gid_t gid,
struct group *result,
char *buffer, size_t buflen,
char **extra_data,
uint32_t *extra_data_len);

/* initgroups db */
errno_t sss_nss_mc_initgroups_dyn(const char *name, size_t name_len,
Expand Down