uio: Fix use-after-free in uio_open
[platform/kernel/linux-starfive.git] / drivers / uio / uio.c
index 62082d6..2d572f6 100644 (file)
@@ -466,13 +466,13 @@ static int uio_open(struct inode *inode, struct file *filep)
 
        mutex_lock(&minor_lock);
        idev = idr_find(&uio_idr, iminor(inode));
-       mutex_unlock(&minor_lock);
        if (!idev) {
                ret = -ENODEV;
+               mutex_unlock(&minor_lock);
                goto out;
        }
-
        get_device(&idev->dev);
+       mutex_unlock(&minor_lock);
 
        if (!try_module_get(idev->owner)) {
                ret = -ENODEV;
@@ -1064,9 +1064,8 @@ void uio_unregister_device(struct uio_info *info)
        wake_up_interruptible(&idev->wait);
        kill_fasync(&idev->async_queue, SIGIO, POLL_HUP);
 
-       device_unregister(&idev->dev);
-
        uio_free_minor(minor);
+       device_unregister(&idev->dev);
 
        return;
 }