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 c98edb67cfb2c8d3fece7bd55022ce0fc3d7e614..c53cecd072b16c15d24809e5565baa4727db7e29 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)