mirror of
https://github.com/libvirt/libvirt.git
synced 2026-08-04 10:23:02 -05:00
Allow passing a vroot into security manager hostdev labelling
When LXC labels USB devices during hotplug, it is running in host context, so it needs to pass in a vroot path to the container root. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
@@ -742,8 +742,8 @@ AppArmorReserveSecurityLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||
static int
|
||||
AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev)
|
||||
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
{
|
||||
struct SDPDOP *ptr;
|
||||
int ret = -1;
|
||||
@@ -770,7 +770,8 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
switch (dev->source.subsys.type) {
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
|
||||
usbDevice *usb = usbGetDevice(dev->source.subsys.u.usb.bus,
|
||||
dev->source.subsys.u.usb.device);
|
||||
dev->source.subsys.u.usb.device,
|
||||
vroot);
|
||||
|
||||
if (!usb)
|
||||
goto done;
|
||||
@@ -808,7 +809,8 @@ done:
|
||||
static int
|
||||
AppArmorRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED)
|
||||
virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED,
|
||||
const char *vroot ATTRIBUTE_UNUSED)
|
||||
|
||||
{
|
||||
const virSecurityLabelDefPtr secdef =
|
||||
|
||||
@@ -474,7 +474,8 @@ virSecurityDACSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
|
||||
static int
|
||||
virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
{
|
||||
void *params[] = {mgr, def};
|
||||
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||
@@ -494,7 +495,8 @@ virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
return 0;
|
||||
|
||||
usb = usbGetDevice(dev->source.subsys.u.usb.bus,
|
||||
dev->source.subsys.u.usb.device);
|
||||
dev->source.subsys.u.usb.device,
|
||||
vroot);
|
||||
if (!usb)
|
||||
goto done;
|
||||
|
||||
@@ -550,8 +552,9 @@ virSecurityDACRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
|
||||
|
||||
static int
|
||||
virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def ATTRIBUTE_UNUSED,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainDefPtr def ATTRIBUTE_UNUSED,
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
|
||||
{
|
||||
virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||
@@ -571,7 +574,8 @@ virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
return 0;
|
||||
|
||||
usb = usbGetDevice(dev->source.subsys.u.usb.bus,
|
||||
dev->source.subsys.u.usb.device);
|
||||
dev->source.subsys.u.usb.device,
|
||||
vroot);
|
||||
if (!usb)
|
||||
goto done;
|
||||
|
||||
@@ -728,7 +732,8 @@ virSecurityDACRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
|
||||
for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||
if (virSecurityDACRestoreSecurityHostdevLabel(mgr,
|
||||
def,
|
||||
def->hostdevs[i]) < 0)
|
||||
def->hostdevs[i],
|
||||
NULL) < 0)
|
||||
rc = -1;
|
||||
}
|
||||
for (i = 0 ; i < def->ndisks ; i++) {
|
||||
@@ -793,7 +798,8 @@ virSecurityDACSetSecurityAllLabel(virSecurityManagerPtr mgr,
|
||||
for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||
if (virSecurityDACSetSecurityHostdevLabel(mgr,
|
||||
def,
|
||||
def->hostdevs[i]) < 0)
|
||||
def->hostdevs[i],
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -61,10 +61,12 @@ typedef int (*virSecurityDomainSetImageLabel) (virSecurityManagerPtr mgr,
|
||||
virDomainDiskDefPtr disk);
|
||||
typedef int (*virSecurityDomainRestoreHostdevLabel) (virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev);
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot);
|
||||
typedef int (*virSecurityDomainSetHostdevLabel) (virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev);
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot);
|
||||
typedef int (*virSecurityDomainSetSavedStateLabel) (virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
const char *savefile);
|
||||
|
||||
@@ -275,10 +275,11 @@ int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
|
||||
|
||||
int virSecurityManagerRestoreHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr vm,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
{
|
||||
if (mgr->drv->domainRestoreSecurityHostdevLabel)
|
||||
return mgr->drv->domainRestoreSecurityHostdevLabel(mgr, vm, dev);
|
||||
return mgr->drv->domainRestoreSecurityHostdevLabel(mgr, vm, dev, vroot);
|
||||
|
||||
virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
||||
return -1;
|
||||
@@ -286,10 +287,11 @@ int virSecurityManagerRestoreHostdevLabel(virSecurityManagerPtr mgr,
|
||||
|
||||
int virSecurityManagerSetHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr vm,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
{
|
||||
if (mgr->drv->domainSetSecurityHostdevLabel)
|
||||
return mgr->drv->domainSetSecurityHostdevLabel(mgr, vm, dev);
|
||||
return mgr->drv->domainSetSecurityHostdevLabel(mgr, vm, dev, vroot);
|
||||
|
||||
virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
||||
return -1;
|
||||
|
||||
@@ -71,10 +71,12 @@ int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDiskDefPtr disk);
|
||||
int virSecurityManagerRestoreHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev);
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot);
|
||||
int virSecurityManagerSetHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev);
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot);
|
||||
int virSecurityManagerSetSavedStateLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
const char *savefile);
|
||||
|
||||
@@ -84,14 +84,16 @@ static int virSecurityDomainSetImageLabelNop(virSecurityManagerPtr mgr ATTRIBUTE
|
||||
|
||||
static int virSecurityDomainRestoreHostdevLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||
virDomainDefPtr vm ATTRIBUTE_UNUSED,
|
||||
virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED)
|
||||
virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED,
|
||||
const char *vroot ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int virSecurityDomainSetHostdevLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||
virDomainDefPtr vm ATTRIBUTE_UNUSED,
|
||||
virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED)
|
||||
virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED,
|
||||
const char *vroot ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1161,7 +1161,8 @@ virSecuritySELinuxSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
|
||||
static int
|
||||
virSecuritySELinuxSetSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
|
||||
{
|
||||
virSecurityLabelDefPtr secdef;
|
||||
@@ -1185,7 +1186,8 @@ virSecuritySELinuxSetSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UN
|
||||
return 0;
|
||||
|
||||
usb = usbGetDevice(dev->source.subsys.u.usb.bus,
|
||||
dev->source.subsys.u.usb.device);
|
||||
dev->source.subsys.u.usb.device,
|
||||
vroot);
|
||||
if (!usb)
|
||||
goto done;
|
||||
|
||||
@@ -1238,7 +1240,8 @@ virSecuritySELinuxRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
|
||||
static int
|
||||
virSecuritySELinuxRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||
virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
|
||||
{
|
||||
virSecurityLabelDefPtr secdef;
|
||||
@@ -1262,7 +1265,8 @@ virSecuritySELinuxRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUT
|
||||
return 0;
|
||||
|
||||
usb = usbGetDevice(dev->source.subsys.u.usb.bus,
|
||||
dev->source.subsys.u.usb.device);
|
||||
dev->source.subsys.u.usb.device,
|
||||
vroot);
|
||||
if (!usb)
|
||||
goto done;
|
||||
|
||||
@@ -1504,7 +1508,8 @@ virSecuritySELinuxRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
|
||||
for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||
if (virSecuritySELinuxRestoreSecurityHostdevLabel(mgr,
|
||||
def,
|
||||
def->hostdevs[i]) < 0)
|
||||
def->hostdevs[i],
|
||||
NULL) < 0)
|
||||
rc = -1;
|
||||
}
|
||||
for (i = 0 ; i < def->ndisks ; i++) {
|
||||
@@ -1874,8 +1879,9 @@ virSecuritySELinuxSetSecurityAllLabel(virSecurityManagerPtr mgr,
|
||||
|
||||
for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||
if (virSecuritySELinuxSetSecurityHostdevLabel(mgr,
|
||||
def,
|
||||
def->hostdevs[i]) < 0)
|
||||
def,
|
||||
def->hostdevs[i],
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -236,7 +236,8 @@ virSecurityStackRestoreSecurityImageLabel(virSecurityManagerPtr mgr,
|
||||
static int
|
||||
virSecurityStackSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr vm,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
|
||||
{
|
||||
virSecurityStackDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||
@@ -244,7 +245,10 @@ virSecurityStackSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
int rc = 0;
|
||||
|
||||
for (; item; item = item->next) {
|
||||
if (virSecurityManagerSetHostdevLabel(item->securityManager, vm, dev) < 0)
|
||||
if (virSecurityManagerSetHostdevLabel(item->securityManager,
|
||||
vm,
|
||||
dev,
|
||||
vroot) < 0)
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
@@ -255,14 +259,18 @@ virSecurityStackSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
static int
|
||||
virSecurityStackRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr vm,
|
||||
virDomainHostdevDefPtr dev)
|
||||
virDomainHostdevDefPtr dev,
|
||||
const char *vroot)
|
||||
{
|
||||
virSecurityStackDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||
virSecurityStackItemPtr item = priv->itemsHead;
|
||||
int rc = 0;
|
||||
|
||||
for (; item; item = item->next) {
|
||||
if (virSecurityManagerRestoreHostdevLabel(item->securityManager, vm, dev) < 0)
|
||||
if (virSecurityManagerRestoreHostdevLabel(item->securityManager,
|
||||
vm,
|
||||
dev,
|
||||
vroot) < 0)
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user