valid_path(const char *path, const bool readonly)
{
struct stat sb;
- int npaths;
+ int npaths, opaths;
const char * const restricted[] = {
"/bin/",
"/etc/",
"/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");
}
}
+ 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) {
}
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");
path = NULL;
if (ret < 0) {
- vah_warning("skipping backingStore check (open failed)");
+ vah_warning("could not open path, skipping");
continue;
}
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,
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;