]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
video: fbdev: w100fb: Reset global state
authorEvgeny Novikov <novikov@ispras.ru>
Wed, 11 Aug 2021 16:58:26 +0000 (19:58 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Apr 2022 07:06:39 +0000 (09:06 +0200)
[ Upstream commit 8738ddcac644964ae128ccd3d80d48773c8d528e ]

w100fb_probe() did not reset the global state to its initial state. This
can result in invocation of iounmap() even when there was not the
appropriate successful call of ioremap(). For instance, this may be the
case if first probe fails after two successful ioremap() while second
probe fails when first ioremap() fails. The similar issue is with
w100fb_remove(). The patch fixes both bugs.

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

Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
Co-developed-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
Signed-off-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/video/fbdev/w100fb.c

index 7bd4c27cfb149901e0cef3e3adb60e4cfee1b9da..b3b17b6adb7ed0cd8cf05843bd6edcc39e501630 100644 (file)
@@ -772,12 +772,18 @@ out:
                fb_dealloc_cmap(&info->cmap);
                kfree(info->pseudo_palette);
        }
-       if (remapped_fbuf != NULL)
+       if (remapped_fbuf != NULL) {
                iounmap(remapped_fbuf);
-       if (remapped_regs != NULL)
+               remapped_fbuf = NULL;
+       }
+       if (remapped_regs != NULL) {
                iounmap(remapped_regs);
-       if (remapped_base != NULL)
+               remapped_regs = NULL;
+       }
+       if (remapped_base != NULL) {
                iounmap(remapped_base);
+               remapped_base = NULL;
+       }
        if (info)
                framebuffer_release(info);
        return err;
@@ -802,8 +808,11 @@ static int w100fb_remove(struct platform_device *pdev)
        fb_dealloc_cmap(&info->cmap);
 
        iounmap(remapped_base);
+       remapped_base = NULL;
        iounmap(remapped_regs);
+       remapped_regs = NULL;
        iounmap(remapped_fbuf);
+       remapped_fbuf = NULL;
 
        framebuffer_release(info);