mei: do not pin module if cldrv->probe() failed
authorAlexey Khoroshilov <khoroshilov@ispras.ru>
Fri, 1 Apr 2016 20:53:01 +0000 (23:53 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 30 Apr 2016 21:08:08 +0000 (14:08 -0700)
If cldrv->probe() failed in mei_cl_device_probe(),
the mei module is left pinned.

The patch moves __module_get(THIS_MODULE) after cldrv->probe().

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/bus.c

index 04dc051508981d0bd469eddbd0203fec06f2b7b1..bc13f5f35a192f235ffad01098c2067d3fb337ab 100644 (file)
@@ -580,6 +580,7 @@ static int mei_cl_device_probe(struct device *dev)
        struct mei_cl_device *cldev;
        struct mei_cl_driver *cldrv;
        const struct mei_cl_device_id *id;
+       int ret;
 
        cldev = to_mei_cl_device(dev);
        cldrv = to_mei_cl_driver(dev->driver);
@@ -594,9 +595,12 @@ static int mei_cl_device_probe(struct device *dev)
        if (!id)
                return -ENODEV;
 
-       __module_get(THIS_MODULE);
+       ret = cldrv->probe(cldev, id);
+       if (ret)
+               return ret;
 
-       return cldrv->probe(cldev, id);
+       __module_get(THIS_MODULE);
+       return 0;
 }
 
 /**