4.14-stable review patch.  If anyone has any objections, please let me know.


From: Shuah Khan <shua...@osg.samsung.com>

commit ef54cf0c600fb8f5737fb001a9e357edda1a1de8 upstream.

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

usbip attach -r localhost -b busid
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

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

Signed-off-by: Shuah Khan <shua...@osg.samsung.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

 tools/usb/usbip/src/usbip_bind.c |    9 +++++++++
 1 file changed, 9 insertions(+)

--- a/tools/usb/usbip/src/usbip_bind.c
+++ b/tools/usb/usbip/src/usbip_bind.c
@@ -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();
@@ -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);
+       /* 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);

Reply via email to