1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

nwrap: Implement nwrap_files_initgroups()

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
This commit is contained in:
Andreas Schneider 2015-09-11 13:37:57 +02:00 committed by Michael Adam
parent 80abc70bc9
commit 90585c46eb

View File

@ -2204,14 +2204,65 @@ static void nwrap_files_endpwent(struct nwrap_backend *b)
/* misc functions */
static int nwrap_files_initgroups(struct nwrap_backend *b,
const char *user, gid_t group)
const char *user,
gid_t group)
{
(void) b; /* unused */
(void) user; /* unused */
(void) group; /* used */
struct group *grp;
gid_t *groups;
int size = 1;
int rc;
/* TODO: maybe we should also fake this... */
return EPERM;
groups = (gid_t *)malloc(size * sizeof(gid_t));
if (groups == NULL) {
NWRAP_LOG(NWRAP_LOG_ERROR, "Out of memory");
errno = ENOMEM;
return -1;
}
groups[0] = group;
nwrap_files_setgrent(b);
while ((grp = nwrap_files_getgrent(b)) != NULL) {
int i = 0;
NWRAP_LOG(NWRAP_LOG_DEBUG,
"Inspecting %s for group membership",
grp->gr_name);
for (i=0; grp->gr_mem && grp->gr_mem[i] != NULL; i++) {
if (group != grp->gr_gid &&
(strcmp(user, grp->gr_mem[i]) == 0)) {
NWRAP_LOG(NWRAP_LOG_DEBUG,
"%s is member of %s",
user,
grp->gr_name);
groups = (gid_t *)realloc(groups,
(size + 1) * sizeof(gid_t));
if (groups == NULL) {
NWRAP_LOG(NWRAP_LOG_ERROR,
"Out of memory");
errno = ENOMEM;
return -1;
}
groups[size] = grp->gr_gid;
size++;
}
}
}
nwrap_files_endgrent(b);
NWRAP_LOG(NWRAP_LOG_DEBUG,
"%s is member of %d groups",
user, size);
/* This really only works if uid_wrapper is loaded */
rc = setgroups(size, groups);
free(groups);
return rc;
}
/* group functions */