video: tegra: host: fix Coverity issues
Deepak Nibade [Wed, 31 Jul 2013 09:45:34 +0000 (14:45 +0530)]
- fix dereference of NULL return value. Add a NULL check
  Coverity id : 23335
- fix logically dead code
  handle function return values and use them for error checking
  Coverity id : 23733
- fix write to pointer after free
  free the pointer only after all operations are performed on it
  Coverity id : 23719
- fix dereference before NULL check
  check for NULL before dereferencing the variable
  Coverity id : 22918
- fix out of bounds read
  first check if value of variable 'i' is within range and
  then only use it as array index
  Coverity id : 23662

Bug 1329327

Change-Id: I70c9d6b00672211c7aaecc023ff2229efb52517f
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/256283
Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com>
Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>

drivers/video/tegra/host/bus_client.c
drivers/video/tegra/host/host1x/host1x.c
drivers/video/tegra/host/msenc/msenc.c
drivers/video/tegra/host/nvhost_acm.c

index 28e10c3..0b483bc 100644 (file)
 
 static int validate_reg(struct platform_device *ndev, u32 offset, int count)
 {
-       struct resource *r = platform_get_resource(ndev, IORESOURCE_MEM, 0);
        int err = 0;
+       struct resource *r = platform_get_resource(ndev, IORESOURCE_MEM, 0);
+       if (!r) {
+               dev_err(&ndev->dev, "failed to get memory resource\n");
+               return -ENODEV;
+       }
 
        if (offset + 4 * count > resource_size(r)
                        || (offset + 4 * count < offset))
index 47258eb..37ccf86 100644 (file)
@@ -688,11 +688,11 @@ static int nvhost_probe(struct platform_device *dev)
 
 #ifdef CONFIG_PM_RUNTIME
        if (pdata->clockgate_delay)
-               pm_runtime_put_sync_autosuspend(&dev->dev);
+               err = pm_runtime_put_sync_autosuspend(&dev->dev);
        else
-               pm_runtime_put(&dev->dev);
+               err = pm_runtime_put(&dev->dev);
        if (err)
-               return err;
+               goto fail;
 #endif
 
        dev_info(&dev->dev, "initialized\n");
index a09cc16..d8d5ad1 100644 (file)
@@ -400,9 +400,9 @@ void nvhost_msenc_deinit(struct platform_device *dev)
                nvhost_memmgr_put(nvhost_get_host(dev)->memmgr, m->mem_r);
                m->mem_r = NULL;
        }
+       m->valid = false;
        kfree(m);
        set_msenc(dev, NULL);
-       m->valid = false;
 }
 
 int nvhost_msenc_finalize_poweron(struct platform_device *dev)
index baf3b07..a46546d 100644 (file)
@@ -438,7 +438,7 @@ int nvhost_module_init(struct platform_device *dev)
        /* initialize clocks to known state (=enabled) */
        pdata->num_clks = 0;
        INIT_LIST_HEAD(&pdata->client_list);
-       while (pdata->clocks[i].name && i < NVHOST_MODULE_MAX_CLOCKS) {
+       while (i < NVHOST_MODULE_MAX_CLOCKS && pdata->clocks[i].name) {
                char devname[MAX_DEVID_LENGTH];
                long rate = pdata->clocks[i].default_rate;
                struct clk *c;