Skip to content

Commit

Permalink
usbip: prevent bind loops on devices attached to vhci_hcd
Browse files Browse the repository at this point in the history
usbip host binds to devices attached to vhci_hcd on the same server
when user does attach over localhost or specifies the server as the
remote.

usbip attach -r localhost -b busid
or
usbip attach -r servername (or server IP)

Unbind followed by bind works, however device is left in a bad state with
accesses via the attached busid result in errors and system hangs during
shutdown.

Fix it to check and bail out if the device is already attached to vhci_hcd.

Cc: [email protected]
Signed-off-by: Shuah Khan <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Shuah Khan authored and gregkh committed Jan 22, 2018
1 parent f0b4198 commit ef54cf0
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions tools/usb/usbip/src/usbip_bind.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ static int bind_device(char *busid)
int rc;
struct udev *udev;
struct udev_device *dev;
const char *devpath;

/* Check whether the device with this bus ID exists. */
udev = udev_new();
Expand All @@ -152,8 +153,16 @@ static int bind_device(char *busid)
err("device with the specified bus ID does not exist");
return -1;
}
devpath = udev_device_get_devpath(dev);
udev_unref(udev);

/* If the device is already attached to vhci_hcd - bail out */
if (strstr(devpath, USBIP_VHCI_DRV_NAME)) {
err("bind loop detected: device: %s is attached to %s\n",
devpath, USBIP_VHCI_DRV_NAME);
return -1;
}

rc = unbind_other(busid);
if (rc == UNBIND_ST_FAILED) {
err("could not unbind driver from device on busid %s", busid);
Expand Down

0 comments on commit ef54cf0

Please sign in to comment.