]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
coresight: tmc: Smatch: Fix potential NULL pointer dereference
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Fri, 21 Jun 2019 17:52:05 +0000 (11:52 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Jul 2019 19:16:37 +0000 (21:16 +0200)
Based on the following report from Smatch, fix the potential
NULL pointer dereference check.

The patch 743256e214e8: "coresight: tmc: Clean up device specific
data" from May 22, 2019, leads to the following Smatch complaint:

    drivers/hwtracing/coresight/coresight-tmc-etr.c:625 tmc_etr_free_flat_buf()
    warn: variable dereferenced before check 'flat_buf' (see line 623)

drivers/hwtracing/coresight/coresight-tmc-etr.c
   622 struct etr_flat_buf *flat_buf = etr_buf->private;
   623 struct device *real_dev = flat_buf->dev->parent;
                                          ^^^^^^^^^^
The patch introduces a new NULL check

   624
   625 if (flat_buf && flat_buf->daddr)
                    ^^^^^^^^
but the existing code assumed it can be NULL.

   626 dma_free_coherent(real_dev, flat_buf->size,
   627   flat_buf->vaddr, flat_buf->daddr);

Cc: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: https://lore.kernel.org/r/20190621175205.24551-3-mathieu.poirier@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-tmc-etr.c

index 5d2bf6d1896152375b756872241a84a48c735acb..17006705287a525c697d9970ffed9f7e99aaef6f 100644 (file)
@@ -620,11 +620,13 @@ static int tmc_etr_alloc_flat_buf(struct tmc_drvdata *drvdata,
 static void tmc_etr_free_flat_buf(struct etr_buf *etr_buf)
 {
        struct etr_flat_buf *flat_buf = etr_buf->private;
-       struct device *real_dev = flat_buf->dev->parent;
 
-       if (flat_buf && flat_buf->daddr)
+       if (flat_buf && flat_buf->daddr) {
+               struct device *real_dev = flat_buf->dev->parent;
+
                dma_free_coherent(real_dev, flat_buf->size,
                                  flat_buf->vaddr, flat_buf->daddr);
+       }
        kfree(flat_buf);
 }