media: isif: reset global state
authorEvgeny Novikov <novikov@ispras.ru>
Tue, 14 Jul 2020 17:20:49 +0000 (19:20 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 16 Nov 2020 09:31:15 +0000 (10:31 +0100)
isif_probe() invokes iounmap() on error handling paths, but it does not
reset the global state. So, later it can invoke iounmap() even when
ioremap() fails. This is the case also for isif_remove(). The patch
resets the global state after invoking iounmap() to avoid this.

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

Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/davinci/isif.c

index c98edb6..c53cecd 100644 (file)
@@ -1075,10 +1075,14 @@ fail_base_iomap:
        release_mem_region(res->start, resource_size(res));
        i--;
 fail_nobase_res:
-       if (isif_cfg.base_addr)
+       if (isif_cfg.base_addr) {
                iounmap(isif_cfg.base_addr);
-       if (isif_cfg.linear_tbl0_addr)
+               isif_cfg.base_addr = NULL;
+       }
+       if (isif_cfg.linear_tbl0_addr) {
                iounmap(isif_cfg.linear_tbl0_addr);
+               isif_cfg.linear_tbl0_addr = NULL;
+       }
 
        while (i >= 0) {
                res = platform_get_resource(pdev, IORESOURCE_MEM, i);
@@ -1096,8 +1100,11 @@ static int isif_remove(struct platform_device *pdev)
        int i = 0;
 
        iounmap(isif_cfg.base_addr);
+       isif_cfg.base_addr = NULL;
        iounmap(isif_cfg.linear_tbl0_addr);
+       isif_cfg.linear_tbl0_addr = NULL;
        iounmap(isif_cfg.linear_tbl1_addr);
+       isif_cfg.linear_tbl1_addr = NULL;
        while (i < 3) {
                res = platform_get_resource(pdev, IORESOURCE_MEM, i);
                if (res)