This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: davinci_vpfe: fix vpfe_ipipe_init() error handling
Author:  Mauro Carvalho Chehab <[email protected]>
Date:    Fri Apr 6 06:26:34 2018 -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 <[email protected]>

 drivers/staging/media/davinci_vpfe/dm365_ipipe.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

---

diff --git a/drivers/staging/media/davinci_vpfe/dm365_ipipe.c 
b/drivers/staging/media/davinci_vpfe/dm365_ipipe.c
index dd0cfc79f50c..b3a193ddd778 100644
--- a/drivers/staging/media/davinci_vpfe/dm365_ipipe.c
+++ b/drivers/staging/media/davinci_vpfe/dm365_ipipe.c
@@ -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;
 }
 

_______________________________________________
linuxtv-commits mailing list
[email protected]
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to