media: davinci_vpfe: fix vpfe_ipipe_init() error handling
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 6 Apr 2018 10:26:34 +0000 (06:26 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 17 Apr 2018 09:23:06 +0000 (05:23 -0400)
As warned:
drivers/staging/media/davinci_vpfe/dm365_ipipe.c:1834 vpfe_ipipe_init() error: we previously assumed 'res' could be null (see line 1797)

There's something wrong at vpfe_ipipe_init():

1) it caches the resourse_size() from from the first region
   and reuses to the second region;

2) the "res" var is overridden 3 times;

3) at free logic, it assumes that "res->start" is not
   overridden by platform_get_resource(pdev, IORESOURCE_MEM, 6),
   but that's not true, as it can even be NULL there.

This patch fixes the above issues by:

a) store the resources used by release_mem_region() on
   a separate var;

b) stop caching resource_size(), using the function where
   needed.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/staging/media/davinci_vpfe/dm365_ipipe.c

index dd0cfc7..b3a193d 100644 (file)
@@ -1778,25 +1778,25 @@ vpfe_ipipe_init(struct vpfe_ipipe_device *ipipe, struct platform_device *pdev)
        struct media_pad *pads = &ipipe->pads[0];
        struct v4l2_subdev *sd = &ipipe->subdev;
        struct media_entity *me = &sd->entity;
-       static resource_size_t  res_len;
-       struct resource *res;
+       struct resource *res, *memres;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 4);
        if (!res)
                return -ENOENT;
 
-       res_len = resource_size(res);
-       res = request_mem_region(res->start, res_len, res->name);
-       if (!res)
+       memres = request_mem_region(res->start, resource_size(res), res->name);
+       if (!memres)
                return -EBUSY;
-       ipipe->base_addr = ioremap_nocache(res->start, res_len);
+       ipipe->base_addr = ioremap_nocache(memres->start,
+                                          resource_size(memres));
        if (!ipipe->base_addr)
                goto error_release;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 6);
        if (!res)
                goto error_unmap;
-       ipipe->isp5_base_addr = ioremap_nocache(res->start, res_len);
+       ipipe->isp5_base_addr = ioremap_nocache(res->start,
+                                               resource_size(res));
        if (!ipipe->isp5_base_addr)
                goto error_unmap;
 
@@ -1831,7 +1831,7 @@ vpfe_ipipe_init(struct vpfe_ipipe_device *ipipe, struct platform_device *pdev)
 error_unmap:
        iounmap(ipipe->base_addr);
 error_release:
-       release_mem_region(res->start, res_len);
+       release_mem_region(memres->start, resource_size(memres));
        return -ENOMEM;
 }