mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
qemu: Copy SELinux labels for namespace too
When creating new /dev/* for qemu, we do chown() and copy ACLs to create the exact copy from the original /dev. I though that copying SELinux labels is not necessary as SELinux will chose the sane defaults. Surprisingly, it does not leaving namespace with the following labels: crw-rw-rw-. root root system_u:object_r:tmpfs_t:s0 random crw-------. root root system_u:object_r:tmpfs_t:s0 rtc0 drwxrwxrwt. root root system_u:object_r:tmpfs_t:s0 shm crw-rw-rw-. root root system_u:object_r:tmpfs_t:s0 urandom As a result, domain is unable to start: error: internal error: process exited while connecting to monitor: Error in GnuTLS initialization: Failed to acquire random data. qemu-kvm: cannot initialize crypto: Unable to initialize GNUTLS library: Failed to acquire random data. The solution is to copy the SELinux labels as well. Reported-by: Andrea Bolognani <abologna@redhat.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
b7f01ea0ed
commit
93a062c3b2
@ -63,6 +63,9 @@
|
|||||||
#if defined(HAVE_SYS_MOUNT_H)
|
#if defined(HAVE_SYS_MOUNT_H)
|
||||||
# include <sys/mount.h>
|
# include <sys/mount.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
# include <selinux/selinux.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <libxml/xpathInternals.h>
|
#include <libxml/xpathInternals.h>
|
||||||
|
|
||||||
@ -6958,6 +6961,9 @@ qemuDomainCreateDevice(const char *device,
|
|||||||
char *canonDevicePath = NULL;
|
char *canonDevicePath = NULL;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
char *tcon = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (virFileResolveAllLinks(device, &canonDevicePath) < 0) {
|
if (virFileResolveAllLinks(device, &canonDevicePath) < 0) {
|
||||||
if (errno == ENOENT && allow_noent) {
|
if (errno == ENOENT && allow_noent) {
|
||||||
@ -7023,10 +7029,35 @@ qemuDomainCreateDevice(const char *device,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
if (getfilecon_raw(canonDevicePath, &tcon) < 0 &&
|
||||||
|
(errno != ENOTSUP && errno != ENODATA)) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to get SELinux label from %s"),
|
||||||
|
canonDevicePath);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcon &&
|
||||||
|
setfilecon_raw(devicePath, (VIR_SELINUX_CTX_CONST char *) tcon) < 0) {
|
||||||
|
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||||
|
if (errno != EOPNOTSUPP && errno != ENOTSUP) {
|
||||||
|
VIR_WARNINGS_RESET
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to set SELinux label on %s"),
|
||||||
|
devicePath);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(canonDevicePath);
|
VIR_FREE(canonDevicePath);
|
||||||
VIR_FREE(devicePath);
|
VIR_FREE(devicePath);
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
freecon(tcon);
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7472,6 +7503,9 @@ struct qemuDomainAttachDeviceMknodData {
|
|||||||
const char *file;
|
const char *file;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
void *acl;
|
void *acl;
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
char *tcon;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -7515,6 +7549,19 @@ qemuDomainAttachDeviceMknodHelper(pid_t pid ATTRIBUTE_UNUSED,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
if (setfilecon_raw(data->file, (VIR_SELINUX_CTX_CONST char *) data->tcon) < 0) {
|
||||||
|
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||||
|
if (errno != EOPNOTSUPP && errno != ENOTSUP) {
|
||||||
|
VIR_WARNINGS_RESET
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to set SELinux label on %s"),
|
||||||
|
data->file);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch ((virDomainDeviceType) data->devDef->type) {
|
switch ((virDomainDeviceType) data->devDef->type) {
|
||||||
case VIR_DOMAIN_DEVICE_DISK: {
|
case VIR_DOMAIN_DEVICE_DISK: {
|
||||||
virDomainDiskDefPtr def = data->devDef->data.disk;
|
virDomainDiskDefPtr def = data->devDef->data.disk;
|
||||||
@ -7571,6 +7618,9 @@ qemuDomainAttachDeviceMknodHelper(pid_t pid ATTRIBUTE_UNUSED,
|
|||||||
cleanup:
|
cleanup:
|
||||||
if (ret < 0 && delDevice)
|
if (ret < 0 && delDevice)
|
||||||
unlink(data->file);
|
unlink(data->file);
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
freecon(data->tcon);
|
||||||
|
#endif
|
||||||
virFileFreeACLs(&data->acl);
|
virFileFreeACLs(&data->acl);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -7605,6 +7655,15 @@ qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
if (getfilecon_raw(file, &data.tcon) < 0 &&
|
||||||
|
(errno != ENOTSUP && errno != ENODATA)) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("Unable to get SELinux label from %s"), file);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (virSecurityManagerPreFork(driver->securityManager) < 0)
|
if (virSecurityManagerPreFork(driver->securityManager) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -7619,8 +7678,11 @@ qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
freecon(data.tcon);
|
||||||
|
#endif
|
||||||
virFileFreeACLs(&data.acl);
|
virFileFreeACLs(&data.acl);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user