usbip: fix error handling in stub_probe()
If usb_hub_claim_port() fails, no resources are deallocated and if stub_add_files() fails, port is not released. The patch fixes these issues and rearranges error handling code. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Acked-by: Valentina Manea <valentina.manea.m@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
016040268c
Коммит
3ff6744575
|
@ -311,7 +311,6 @@ static int stub_probe(struct usb_device *udev)
|
||||||
{
|
{
|
||||||
struct stub_device *sdev = NULL;
|
struct stub_device *sdev = NULL;
|
||||||
const char *udev_busid = dev_name(&udev->dev);
|
const char *udev_busid = dev_name(&udev->dev);
|
||||||
int err = 0;
|
|
||||||
struct bus_id_priv *busid_priv;
|
struct bus_id_priv *busid_priv;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -372,23 +371,28 @@ static int stub_probe(struct usb_device *udev)
|
||||||
(struct usb_dev_state *) udev);
|
(struct usb_dev_state *) udev);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_dbg(&udev->dev, "unable to claim port\n");
|
dev_dbg(&udev->dev, "unable to claim port\n");
|
||||||
return rc;
|
goto err_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = stub_add_files(&udev->dev);
|
rc = stub_add_files(&udev->dev);
|
||||||
if (err) {
|
if (rc) {
|
||||||
dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
|
dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
|
||||||
dev_set_drvdata(&udev->dev, NULL);
|
goto err_files;
|
||||||
usb_put_dev(udev);
|
|
||||||
kthread_stop_put(sdev->ud.eh);
|
|
||||||
|
|
||||||
busid_priv->sdev = NULL;
|
|
||||||
stub_device_free(sdev);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
busid_priv->status = STUB_BUSID_ALLOC;
|
busid_priv->status = STUB_BUSID_ALLOC;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
err_files:
|
||||||
|
usb_hub_release_port(udev->parent, udev->portnum,
|
||||||
|
(struct usb_dev_state *) udev);
|
||||||
|
err_port:
|
||||||
|
dev_set_drvdata(&udev->dev, NULL);
|
||||||
|
usb_put_dev(udev);
|
||||||
|
kthread_stop_put(sdev->ud.eh);
|
||||||
|
|
||||||
|
busid_priv->sdev = NULL;
|
||||||
|
stub_device_free(sdev);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shutdown_busid(struct bus_id_priv *busid_priv)
|
static void shutdown_busid(struct bus_id_priv *busid_priv)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче