mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 07:59:00 +00:00
security_dac: Allow callers to enable/disable label remembering/recall
Because the implementation that will be used for label remembering/recall is not atomic we have to give callers a chance to enable or disable it. That is, enable it if and only if metadata locking is enabled. Otherwise the feature MUST be turned off. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
a30e6d17c9
commit
fa808763b2
@ -182,11 +182,13 @@ static int virSecurityDACSetOwnership(virSecurityManagerPtr mgr,
|
|||||||
const virStorageSource *src,
|
const virStorageSource *src,
|
||||||
const char *path,
|
const char *path,
|
||||||
uid_t uid,
|
uid_t uid,
|
||||||
gid_t gid);
|
gid_t gid,
|
||||||
|
bool remember);
|
||||||
|
|
||||||
static int virSecurityDACRestoreFileLabelInternal(virSecurityManagerPtr mgr,
|
static int virSecurityDACRestoreFileLabelInternal(virSecurityManagerPtr mgr,
|
||||||
const virStorageSource *src,
|
const virStorageSource *src,
|
||||||
const char *path);
|
const char *path,
|
||||||
|
bool recall);
|
||||||
/**
|
/**
|
||||||
* virSecurityDACTransactionRun:
|
* virSecurityDACTransactionRun:
|
||||||
* @pid: process pid
|
* @pid: process pid
|
||||||
@ -234,11 +236,13 @@ virSecurityDACTransactionRun(pid_t pid ATTRIBUTE_UNUSED,
|
|||||||
item->src,
|
item->src,
|
||||||
item->path,
|
item->path,
|
||||||
item->uid,
|
item->uid,
|
||||||
item->gid);
|
item->gid,
|
||||||
|
list->lock);
|
||||||
} else {
|
} else {
|
||||||
rv = virSecurityDACRestoreFileLabelInternal(list->manager,
|
rv = virSecurityDACRestoreFileLabelInternal(list->manager,
|
||||||
item->src,
|
item->src,
|
||||||
item->path);
|
item->path,
|
||||||
|
list->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
@ -251,7 +255,8 @@ virSecurityDACTransactionRun(pid_t pid ATTRIBUTE_UNUSED,
|
|||||||
if (!item->restore) {
|
if (!item->restore) {
|
||||||
virSecurityDACRestoreFileLabelInternal(list->manager,
|
virSecurityDACRestoreFileLabelInternal(list->manager,
|
||||||
item->src,
|
item->src,
|
||||||
item->path);
|
item->path,
|
||||||
|
list->lock);
|
||||||
} else {
|
} else {
|
||||||
VIR_WARN("Ignoring failed restore attempt on %s",
|
VIR_WARN("Ignoring failed restore attempt on %s",
|
||||||
NULLSTR(item->src ? item->src->path : item->path));
|
NULLSTR(item->src ? item->src->path : item->path));
|
||||||
@ -699,7 +704,8 @@ virSecurityDACSetOwnership(virSecurityManagerPtr mgr,
|
|||||||
const virStorageSource *src,
|
const virStorageSource *src,
|
||||||
const char *path,
|
const char *path,
|
||||||
uid_t uid,
|
uid_t uid,
|
||||||
gid_t gid)
|
gid_t gid,
|
||||||
|
bool remember)
|
||||||
{
|
{
|
||||||
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
@ -717,7 +723,7 @@ virSecurityDACSetOwnership(virSecurityManagerPtr mgr,
|
|||||||
else if (rc > 0)
|
else if (rc > 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (path) {
|
if (remember && path) {
|
||||||
if (stat(path, &sb) < 0) {
|
if (stat(path, &sb) < 0) {
|
||||||
virReportSystemError(errno, _("unable to stat: %s"), path);
|
virReportSystemError(errno, _("unable to stat: %s"), path);
|
||||||
return -1;
|
return -1;
|
||||||
@ -739,7 +745,7 @@ virSecurityDACSetOwnership(virSecurityManagerPtr mgr,
|
|||||||
* this function. However, if our attempt fails, there's
|
* this function. However, if our attempt fails, there's
|
||||||
* not much we can do. XATTRs refcounting is fubar'ed and
|
* not much we can do. XATTRs refcounting is fubar'ed and
|
||||||
* the only option we have is warn users. */
|
* the only option we have is warn users. */
|
||||||
if (virSecurityDACRestoreFileLabelInternal(mgr, src, path) < 0)
|
if (virSecurityDACRestoreFileLabelInternal(mgr, src, path, remember) < 0)
|
||||||
VIR_WARN("Unable to restore label on '%s'. "
|
VIR_WARN("Unable to restore label on '%s'. "
|
||||||
"XATTRs might have been left in inconsistent state.",
|
"XATTRs might have been left in inconsistent state.",
|
||||||
NULLSTR(src ? src->path : path));
|
NULLSTR(src ? src->path : path));
|
||||||
@ -755,7 +761,8 @@ virSecurityDACSetOwnership(virSecurityManagerPtr mgr,
|
|||||||
static int
|
static int
|
||||||
virSecurityDACRestoreFileLabelInternal(virSecurityManagerPtr mgr,
|
virSecurityDACRestoreFileLabelInternal(virSecurityManagerPtr mgr,
|
||||||
const virStorageSource *src,
|
const virStorageSource *src,
|
||||||
const char *path)
|
const char *path,
|
||||||
|
bool recall)
|
||||||
{
|
{
|
||||||
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||||
int rv;
|
int rv;
|
||||||
@ -774,7 +781,7 @@ virSecurityDACRestoreFileLabelInternal(virSecurityManagerPtr mgr,
|
|||||||
else if (rv > 0)
|
else if (rv > 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (path) {
|
if (recall && path) {
|
||||||
rv = virSecurityDACRecallLabel(priv, path, &uid, &gid);
|
rv = virSecurityDACRecallLabel(priv, path, &uid, &gid);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -793,7 +800,7 @@ static int
|
|||||||
virSecurityDACRestoreFileLabel(virSecurityManagerPtr mgr,
|
virSecurityDACRestoreFileLabel(virSecurityManagerPtr mgr,
|
||||||
const char *path)
|
const char *path)
|
||||||
{
|
{
|
||||||
return virSecurityDACRestoreFileLabelInternal(mgr, NULL, path);
|
return virSecurityDACRestoreFileLabelInternal(mgr, NULL, path, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -840,7 +847,7 @@ virSecurityDACSetImageLabelInternal(virSecurityManagerPtr mgr,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return virSecurityDACSetOwnership(mgr, src, NULL, user, group);
|
return virSecurityDACSetOwnership(mgr, src, NULL, user, group, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -920,7 +927,7 @@ virSecurityDACRestoreImageLabelInt(virSecurityManagerPtr mgr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return virSecurityDACRestoreFileLabelInternal(mgr, src, NULL);
|
return virSecurityDACRestoreFileLabelInternal(mgr, src, NULL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -956,7 +963,7 @@ virSecurityDACSetHostdevLabelHelper(const char *file,
|
|||||||
if (virSecurityDACGetIds(secdef, priv, &user, &group, NULL, NULL) < 0)
|
if (virSecurityDACGetIds(secdef, priv, &user, &group, NULL, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return virSecurityDACSetOwnership(mgr, NULL, file, user, group);
|
return virSecurityDACSetOwnership(mgr, NULL, file, user, group, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1332,7 +1339,7 @@ virSecurityDACSetChardevLabel(virSecurityManagerPtr mgr,
|
|||||||
case VIR_DOMAIN_CHR_TYPE_FILE:
|
case VIR_DOMAIN_CHR_TYPE_FILE:
|
||||||
ret = virSecurityDACSetOwnership(mgr, NULL,
|
ret = virSecurityDACSetOwnership(mgr, NULL,
|
||||||
dev_source->data.file.path,
|
dev_source->data.file.path,
|
||||||
user, group);
|
user, group, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
||||||
@ -1340,12 +1347,12 @@ virSecurityDACSetChardevLabel(virSecurityManagerPtr mgr,
|
|||||||
virAsprintf(&out, "%s.out", dev_source->data.file.path) < 0)
|
virAsprintf(&out, "%s.out", dev_source->data.file.path) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
if (virFileExists(in) && virFileExists(out)) {
|
if (virFileExists(in) && virFileExists(out)) {
|
||||||
if (virSecurityDACSetOwnership(mgr, NULL, in, user, group) < 0 ||
|
if (virSecurityDACSetOwnership(mgr, NULL, in, user, group, false) < 0 ||
|
||||||
virSecurityDACSetOwnership(mgr, NULL, out, user, group) < 0)
|
virSecurityDACSetOwnership(mgr, NULL, out, user, group, false) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
} else if (virSecurityDACSetOwnership(mgr, NULL,
|
} else if (virSecurityDACSetOwnership(mgr, NULL,
|
||||||
dev_source->data.file.path,
|
dev_source->data.file.path,
|
||||||
user, group) < 0) {
|
user, group, false) < 0) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -1360,7 +1367,7 @@ virSecurityDACSetChardevLabel(virSecurityManagerPtr mgr,
|
|||||||
* and passed via FD */
|
* and passed via FD */
|
||||||
if (virSecurityDACSetOwnership(mgr, NULL,
|
if (virSecurityDACSetOwnership(mgr, NULL,
|
||||||
dev_source->data.nix.path,
|
dev_source->data.nix.path,
|
||||||
user, group) < 0)
|
user, group, false) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -1543,7 +1550,7 @@ virSecurityDACSetGraphicsLabel(virSecurityManagerPtr mgr,
|
|||||||
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (virSecurityDACSetOwnership(mgr, NULL, rendernode, user, group) < 0)
|
if (virSecurityDACSetOwnership(mgr, NULL, rendernode, user, group, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1584,7 +1591,9 @@ virSecurityDACSetInputLabel(virSecurityManagerPtr mgr,
|
|||||||
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = virSecurityDACSetOwnership(mgr, NULL, input->source.evdev, user, group);
|
ret = virSecurityDACSetOwnership(mgr, NULL,
|
||||||
|
input->source.evdev,
|
||||||
|
user, group, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
|
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
|
||||||
@ -1772,7 +1781,9 @@ virSecurityDACSetMemoryLabel(virSecurityManagerPtr mgr,
|
|||||||
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = virSecurityDACSetOwnership(mgr, NULL, mem->nvdimmPath, user, group);
|
ret = virSecurityDACSetOwnership(mgr, NULL,
|
||||||
|
mem->nvdimmPath,
|
||||||
|
user, group, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
|
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
|
||||||
@ -1861,27 +1872,32 @@ virSecurityDACSetAllLabel(virSecurityManagerPtr mgr,
|
|||||||
|
|
||||||
if (def->os.loader && def->os.loader->nvram &&
|
if (def->os.loader && def->os.loader->nvram &&
|
||||||
virSecurityDACSetOwnership(mgr, NULL,
|
virSecurityDACSetOwnership(mgr, NULL,
|
||||||
def->os.loader->nvram, user, group) < 0)
|
def->os.loader->nvram,
|
||||||
|
user, group, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (def->os.kernel &&
|
if (def->os.kernel &&
|
||||||
virSecurityDACSetOwnership(mgr, NULL,
|
virSecurityDACSetOwnership(mgr, NULL,
|
||||||
def->os.kernel, user, group) < 0)
|
def->os.kernel,
|
||||||
|
user, group, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (def->os.initrd &&
|
if (def->os.initrd &&
|
||||||
virSecurityDACSetOwnership(mgr, NULL,
|
virSecurityDACSetOwnership(mgr, NULL,
|
||||||
def->os.initrd, user, group) < 0)
|
def->os.initrd,
|
||||||
|
user, group, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (def->os.dtb &&
|
if (def->os.dtb &&
|
||||||
virSecurityDACSetOwnership(mgr, NULL,
|
virSecurityDACSetOwnership(mgr, NULL,
|
||||||
def->os.dtb, user, group) < 0)
|
def->os.dtb,
|
||||||
|
user, group, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (def->os.slic_table &&
|
if (def->os.slic_table &&
|
||||||
virSecurityDACSetOwnership(mgr, NULL,
|
virSecurityDACSetOwnership(mgr, NULL,
|
||||||
def->os.slic_table, user, group) < 0)
|
def->os.slic_table,
|
||||||
|
user, group, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1903,7 +1919,7 @@ virSecurityDACSetSavedStateLabel(virSecurityManagerPtr mgr,
|
|||||||
if (virSecurityDACGetImageIds(secdef, priv, &user, &group) < 0)
|
if (virSecurityDACGetImageIds(secdef, priv, &user, &group) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return virSecurityDACSetOwnership(mgr, NULL, savefile, user, group);
|
return virSecurityDACSetOwnership(mgr, NULL, savefile, user, group, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2223,7 +2239,7 @@ virSecurityDACDomainSetPathLabel(virSecurityManagerPtr mgr,
|
|||||||
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return virSecurityDACSetOwnership(mgr, NULL, path, user, group);
|
return virSecurityDACSetOwnership(mgr, NULL, path, user, group, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
virSecurityDriver virSecurityDriverDAC = {
|
virSecurityDriver virSecurityDriverDAC = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user