| From ab9bfb1764eec6bee5f7215b232bebde488e0147 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 11 Aug 2021 19:58:26 +0300 |
| Subject: video: fbdev: w100fb: Reset global state |
| |
| From: Evgeny Novikov <novikov@ispras.ru> |
| |
| [ 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 | 15 ++++++++++++--- |
| 1 file changed, 12 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/video/fbdev/w100fb.c b/drivers/video/fbdev/w100fb.c |
| index 967030176d87..307066113c35 100644 |
| --- a/drivers/video/fbdev/w100fb.c |
| +++ b/drivers/video/fbdev/w100fb.c |
| @@ -773,12 +773,18 @@ int w100fb_probe(struct platform_device *pdev) |
| 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; |
| @@ -803,8 +809,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); |
| |
| -- |
| 2.34.1 |
| |