From 1efb6236744632c579049ee610dc1c8a42b3ee3d Mon Sep 17 00:00:00 2001 From: Jamie Strandboge Date: Tue, 6 Apr 2010 17:57:36 +0200 Subject: [PATCH] Adjust virt-aa-helper to handle pci devices * src/security/virt-aa-helper.c: adjust virt-aa-helper to handle pci devices. Update valid_path() to have an override array to check against, and add "/sys/devices/pci" to it. Then rename file_iterate_cb() to file_iterate_hostdev_cb() and create file_iterate_pci_cb() based on it --- src/security/virt-aa-helper.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index f9b7c370cd..dd00ed3b00 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -490,7 +490,7 @@ static int valid_path(const char *path, const bool readonly) { struct stat sb; - int npaths; + int npaths, opaths; const char * const restricted[] = { "/bin/", "/etc/", @@ -516,6 +516,10 @@ valid_path(const char *path, const bool readonly) "/initrd", "/initrd.img" }; + /* override the above with these */ + const char * const override[] = { + "/sys/devices/pci" /* for hostdev pci devices */ + }; if (path == NULL || strlen(path) > PATH_MAX - 1) { vah_error(NULL, 0, "bad pathname"); @@ -553,9 +557,12 @@ valid_path(const char *path, const bool readonly) } } + opaths = sizeof(override)/sizeof *(override); + npaths = sizeof(restricted)/sizeof *(restricted); - if (array_starts_with(path, restricted, npaths) == 0) - return 1; + if (array_starts_with(path, restricted, npaths) == 0 && + array_starts_with(path, override, opaths) != 0) + return 1; npaths = sizeof(restricted_rw)/sizeof *(restricted_rw); if (!readonly) { @@ -779,8 +786,16 @@ vah_add_file(virBufferPtr buf, const char *path, const char *perms) } static int -file_iterate_cb(usbDevice *dev ATTRIBUTE_UNUSED, - const char *file, void *opaque) +file_iterate_hostdev_cb(usbDevice *dev ATTRIBUTE_UNUSED, + const char *file, void *opaque) +{ + virBufferPtr buf = opaque; + return vah_add_file(buf, file, "rw"); +} + +static int +file_iterate_pci_cb(pciDevice *dev ATTRIBUTE_UNUSED, + const char *file, void *opaque) { virBufferPtr buf = opaque; return vah_add_file(buf, file, "rw"); @@ -825,7 +840,7 @@ get_files(vahControl * ctl) path = NULL; if (ret < 0) { - vah_warning("skipping backingStore check (open failed)"); + vah_warning("could not open path, skipping"); continue; } @@ -880,13 +895,13 @@ get_files(vahControl * ctl) if (usb == NULL) continue; - rc = usbDeviceFileIterate(usb, file_iterate_cb, &buf); + rc = usbDeviceFileIterate(usb, file_iterate_hostdev_cb, &buf); usbFreeDevice(usb); if (rc != 0) goto clean; break; } -/* TODO: update so files in /sys are readonly + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { pciDevice *pci = pciGetDevice( dev->source.subsys.u.pci.domain, @@ -897,12 +912,12 @@ get_files(vahControl * ctl) if (pci == NULL) continue; - rc = pciDeviceFileIterate(NULL, pci, file_iterate_cb, &buf); + rc = pciDeviceFileIterate(pci, file_iterate_pci_cb, &buf); pciFreeDevice(pci); break; } -*/ + default: rc = 0; break;