struct _virSecurityDACData {
uid_t user;
gid_t group;
+ gid_t *groups;
+ int ngroups;
bool dynamicOwnership;
};
static int
virSecurityDACGetIds(virDomainDefPtr def, virSecurityDACDataPtr priv,
- uid_t *uidPtr, gid_t *gidPtr)
+ uid_t *uidPtr, gid_t *gidPtr,
+ gid_t **groups, int *ngroups)
{
int ret;
return -1;
}
- if ((ret = virSecurityDACParseIds(def, uidPtr, gidPtr)) <= 0)
+ if ((ret = virSecurityDACParseIds(def, uidPtr, gidPtr)) <= 0) {
+ if (groups)
+ *groups = NULL;
+ if (ngroups)
+ *ngroups = 0;
return ret;
+ }
if (!priv) {
virReportError(VIR_ERR_INTERNAL_ERROR,
*uidPtr = priv->user;
if (gidPtr)
*gidPtr = priv->group;
+ if (groups)
+ *groups = priv->groups;
+ if (ngroups)
+ *ngroups = priv->ngroups;
return 0;
}
}
static int
-virSecurityDACClose(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED)
+virSecurityDACClose(virSecurityManagerPtr mgr)
{
+ virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
+ VIR_FREE(priv->groups);
return 0;
}
return "0";
}
+static int
+virSecurityDACPreFork(virSecurityManagerPtr mgr)
+{
+ virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
+ int ngroups;
+
+ VIR_FREE(priv->groups);
+ priv->ngroups = 0;
+ if ((ngroups = virGetGroupList(priv->user, priv->group,
+ &priv->groups)) < 0)
+ return -1;
+ priv->ngroups = ngroups;
+ return 0;
+}
+
static int
virSecurityDACSetOwnership(const char *path, uid_t uid, gid_t gid)
{
uid_t user;
gid_t group;
- if (virSecurityDACGetIds(def, priv, &user, &group))
+ if (virSecurityDACGetIds(def, priv, &user, &group, NULL, NULL))
return -1;
return virSecurityDACSetOwnership(file, user, group);
uid_t user;
gid_t group;
- if (virSecurityDACGetIds(def, priv, &user, &group))
+ if (virSecurityDACGetIds(def, priv, &user, &group, NULL, NULL))
return -1;
switch (dev->type) {
{
uid_t user;
gid_t group;
- virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
gid_t *groups;
int ngroups;
- int ret = -1;
+ virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
- if (virSecurityDACGetIds(def, priv, &user, &group))
- return -1;
- ngroups = virGetGroupList(user, group, &groups);
- if (ngroups < 0)
+ if (virSecurityDACGetIds(def, priv, &user, &group, &groups, &ngroups))
return -1;
- VIR_DEBUG("Dropping privileges of DEF to %u:%u",
- (unsigned int) user, (unsigned int) group);
+ VIR_DEBUG("Dropping privileges of DEF to %u:%u, %d supplemental groups",
+ (unsigned int) user, (unsigned int) group, ngroups);
if (virSetUIDGID(user, group, groups, ngroups) < 0)
- goto cleanup;
- ret = 0;
-cleanup:
- VIR_FREE(groups);
- return ret;
+ return -1;
+
+ return 0;
}
gid_t group;
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
- if (virSecurityDACGetIds(def, priv, &user, &group))
+ if (virSecurityDACGetIds(def, priv, &user, &group, NULL, NULL))
return -1;
VIR_DEBUG("Setting child to drop privileges of DEF to %u:%u",
.getModel = virSecurityDACGetModel,
.getDOI = virSecurityDACGetDOI,
+ .preFork = virSecurityDACPreFork,
+
.domainSecurityVerify = virSecurityDACVerify,
.domainSetSecurityImageLabel = virSecurityDACSetSecurityImageLabel,