|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] libxl: Do not trust frontend for vusb
commit 03814de1d2ecdabedabceb8e728d934a632a43b9
Author: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
AuthorDate: Thu May 5 16:17:18 2016 +0100
Commit: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CommitDate: Thu Jun 2 15:53:28 2016 +0100
libxl: Do not trust frontend for vusb
Do not use the frontend directory for enumerating the vusb devices;
since the frontend could delete them, this could result in devices
being lost and not torn down, etc. Instead, use the /libxl directory
for enumeration. So:
* Replace vusb_be_from_xs_fe with vusb_be_from_xs_libxl
* Change the call sites
* Change various places that use the dompath to use libxl_dom_path
* Rename some `path' variables appropriate (to spot any missed updates)
* Parse backend domid out of backend path rather than reading it from
the frontend (several places)
Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
v3: Whitespace adjustment to parameter list indentation
v2: New patch, following rebase
---
tools/libxl/libxl_pvusb.c | 84 ++++++++++++++++++++++-------------------------
1 file changed, 40 insertions(+), 44 deletions(-)
diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c
index 9f1e842..7af7e4d 100644
--- a/tools/libxl/libxl_pvusb.c
+++ b/tools/libxl/libxl_pvusb.c
@@ -336,28 +336,16 @@ out:
return;
}
-static const char *vusb_be_from_xs_fe(libxl__gc *gc, const char *fe_path,
- uint32_t tgt_domid)
+static const char *vusb_be_from_xs_libxl(libxl__gc *gc, const char *libxl_path)
{
const char *be_path;
int r;
- uint32_t be_domid, fe_domid;
- char be_type[16];
- r = libxl__xs_read_checked(gc, XBT_NULL, GCSPRINTF("%s/backend", fe_path),
+ r = libxl__xs_read_checked(gc, XBT_NULL,
+ GCSPRINTF("%s/backend", libxl_path),
&be_path);
if (r || !be_path) return NULL;
- /* Check to see that it has the proper form, and that fe_domid ==
- * target domid */
- r = sscanf(be_path, "/local/domain/%u/backend/%15[^/]/%u",
- &be_domid, be_type, &fe_domid);
-
- if (r != 3 || fe_domid != tgt_domid) {
- LOG(ERROR, "Malformed backend, refusing to use");
- return NULL;
- }
-
return be_path;
}
@@ -366,15 +354,15 @@ libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid,
int *num)
{
GC_INIT(ctx);
libxl_device_usbctrl *usbctrls = NULL;
- char *path = NULL;
+ char *libxl_vusbs_path = NULL;
char **entry = NULL;
unsigned int nentries = 0;
*num = 0;
- path = GCSPRINTF("%s/device/vusb",
- libxl__xs_get_dompath(gc, domid));
- entry = libxl__xs_directory(gc, XBT_NULL, path, &nentries);
+ libxl_vusbs_path = GCSPRINTF("%s/device/vusb",
+ libxl__xs_libxl_path(gc, domid));
+ entry = libxl__xs_directory(gc, XBT_NULL, libxl_vusbs_path, &nentries);
if (entry && nentries) {
usbctrls = libxl__zalloc(NOGC, sizeof(*usbctrls) * nentries);
@@ -383,7 +371,7 @@ libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid,
int *num)
for (usbctrl = usbctrls;
usbctrl < end;
usbctrl++, entry++, (*num)++) {
- const char *tmp, *be_path, *fe_path;
+ const char *tmp, *be_path, *libxl_path;
int ret;
libxl_device_usbctrl_init(usbctrl);
@@ -405,10 +393,12 @@ libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid,
int *num)
tmp ? atoi(tmp) : -1; \
})
- fe_path = GCSPRINTF("%s/%s", path, *entry);
- be_path = vusb_be_from_xs_fe(gc, fe_path, domid);
+ libxl_path = GCSPRINTF("%s/%s", libxl_vusbs_path, *entry);
+ be_path = READ_SUBPATH(libxl_path, "backend");
if (!be_path) goto out;
- usbctrl->backend_domid = READ_SUBPATH_INT(fe_path, "backend-id");
+ ret = libxl__backendpath_parse_domid(gc, be_path,
+ &usbctrl->backend_domid);
+ if (ret) goto out;
usbctrl->version = READ_SUBPATH_INT(be_path, "usb-ver");
usbctrl->ports = READ_SUBPATH_INT(be_path, "num-ports");
libxl_usbctrl_type_from_string(READ_SUBPATH(be_path, "type"),
@@ -436,6 +426,7 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t
domid,
{
GC_INIT(ctx);
const char *dompath, *fe_path, *be_path, *tmp;
+ const char *libxl_dom_path, *libxl_path;
int rc;
usbctrlinfo->devid = usbctrl->devid;
@@ -458,9 +449,12 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t
domid,
dompath = libxl__xs_get_dompath(gc, domid);
fe_path = GCSPRINTF("%s/device/vusb/%d", dompath, usbctrl->devid);
- be_path = READ_SUBPATH(fe_path, "backend");
+ libxl_dom_path = libxl__xs_libxl_path(gc, domid);
+ libxl_path = GCSPRINTF("%s/device/vusb/%d", libxl_dom_path,
usbctrl->devid);
+ be_path = READ_SUBPATH(libxl_path, "backend");
usbctrlinfo->backend = libxl__strdup(NOGC, be_path);
- usbctrlinfo->backend_id = READ_SUBPATH_INT(fe_path, "backend-id");
+ rc = libxl__backendpath_parse_domid(gc, be_path, &usbctrl->backend_domid);
+ if (rc) goto out;
usbctrlinfo->state = READ_SUBPATH_INT(fe_path, "state");
usbctrlinfo->evtch = READ_SUBPATH_INT(fe_path, "event-channel");
usbctrlinfo->ref_urb = READ_SUBPATH_INT(fe_path, "urb-ring-ref");
@@ -605,13 +599,15 @@ static int get_assigned_devices(libxl__gc *gc,
domlist = libxl__xs_directory(gc, XBT_NULL, "/local/domain", &ndom);
for (i = 0; i < ndom; i++) {
- char *path;
+ char *libxl_vusbs_path;
char **usbctrls;
unsigned int nc = 0;
uint32_t domid = atoi(domlist[i]);
- path = GCSPRINTF("%s/device/vusb", libxl__xs_get_dompath(gc, domid));
- usbctrls = libxl__xs_directory(gc, XBT_NULL, path, &nc);
+ libxl_vusbs_path = GCSPRINTF("%s/device/vusb",
+ libxl__xs_libxl_path(gc, domid));
+ usbctrls = libxl__xs_directory(gc, XBT_NULL,
+ libxl_vusbs_path, &nc);
for (j = 0; j < nc; j++) {
libxl_device_usbdev *tmp = NULL;
@@ -681,16 +677,16 @@ libxl__device_usbdev_list_for_usbctrl(libxl__gc *gc,
libxl_device_usbdev **usbdevs,
int *num)
{
- const char *fe_path, *be_path, *num_devs;
+ const char *libxl_path, *be_path, *num_devs;
int n, i, rc;
*usbdevs = NULL;
*num = 0;
- fe_path = GCSPRINTF("%s/device/vusb/%d",
- libxl__xs_get_dompath(gc, domid), usbctrl);
+ libxl_path = GCSPRINTF("%s/device/vusb/%d",
+ libxl__xs_libxl_path(gc, domid), usbctrl);
- be_path = vusb_be_from_xs_fe(gc, fe_path, domid);
+ be_path = vusb_be_from_xs_libxl(gc, libxl_path);
if (!be_path) {
rc = ERROR_FAIL;
goto out;
@@ -739,16 +735,16 @@ libxl_device_usbdev_list(libxl_ctx *ctx, uint32_t domid,
int *num)
{
GC_INIT(ctx);
libxl_device_usbdev *usbdevs = NULL;
- const char *path;
+ const char *libxl_vusbs_path;
char **usbctrls;
unsigned int nc = 0;
int i, j;
*num = 0;
- path = GCSPRINTF("%s/device/vusb",
- libxl__xs_get_dompath(gc, domid));
- usbctrls = libxl__xs_directory(gc, XBT_NULL, path, &nc);
+ libxl_vusbs_path = GCSPRINTF("%s/device/vusb",
+ libxl__xs_libxl_path(gc, !domid));
+ usbctrls = libxl__xs_directory(gc, XBT_NULL, libxl_vusbs_path, &nc);
for (i = 0; i < nc; i++) {
int rc, nd = 0;
@@ -878,13 +874,13 @@ static int libxl__device_usbdev_setdefault(libxl__gc *gc,
}
} else {
/* A controller was specified; look it up */
- const char *fe_path, *be_path, *tmp;
+ const char *libxl_path, *be_path, *tmp;
- fe_path = GCSPRINTF("%s/device/vusb/%d",
- libxl__xs_get_dompath(gc, domid),
+ libxl_path = GCSPRINTF("%s/device/vusb/%d",
+ libxl__xs_libxl_path(gc, domid),
usbdev->ctrl);
- be_path = vusb_be_from_xs_fe(gc, fe_path, domid);
+ be_path = vusb_be_from_xs_libxl(gc, libxl_path);
if (!be_path) {
rc = ERROR_FAIL;
goto out;
@@ -1651,13 +1647,13 @@ int libxl_ctrlport_to_device_usbdev(libxl_ctx *ctx,
libxl_device_usbdev *usbdev)
{
GC_INIT(ctx);
- const char *dompath, *fe_path, *be_path, *busid;
+ const char *libxl_dom_path, *libxl_path, *be_path, *busid;
int rc;
- dompath = libxl__xs_get_dompath(gc, domid);
+ libxl_dom_path = libxl__xs_libxl_path(gc, domid);
- fe_path = GCSPRINTF("%s/device/vusb/%d", dompath, ctrl);
- be_path = vusb_be_from_xs_fe(gc, fe_path, domid);
+ libxl_path = GCSPRINTF("%s/device/vusb/%d", libxl_dom_path, ctrl);
+ be_path = vusb_be_from_xs_libxl(gc, libxl_path);
if (!be_path) {
rc = ERROR_FAIL;
goto out;
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |