]> git.hungrycats.org Git - linux/commitdiff
dmaengine: ensure dmaengine helpers check valid callback
authorVinod Koul <vinod.koul@intel.com>
Tue, 12 Apr 2016 15:37:06 +0000 (21:07 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 26 May 2018 06:49:00 +0000 (08:49 +0200)
commit 757d12e5849be549076901b0d33c60d5f360269c upstream.

dmaengine has various device callbacks and exposes helper
functions to invoke these. These helpers should check if channel,
device and callback is valid or not before invoking them.

Reported-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Fabrizio Castro <fabrizio.castro@bp.renesas.com>
Signed-off-by: Jianming Qiao <jianming.qiao@bp.renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/dmaengine.h

index c47c68e535e8d1cc87d2f3d4da7319ebdced2d71..a16d1851cfb1452a2a2ecf3720028247044200d2 100644 (file)
@@ -767,6 +767,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single(
        sg_dma_address(&sg) = buf;
        sg_dma_len(&sg) = len;
 
+       if (!chan || !chan->device || !chan->device->device_prep_slave_sg)
+               return NULL;
+
        return chan->device->device_prep_slave_sg(chan, &sg, 1,
                                                  dir, flags, NULL);
 }
@@ -775,6 +778,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg(
        struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len,
        enum dma_transfer_direction dir, unsigned long flags)
 {
+       if (!chan || !chan->device || !chan->device->device_prep_slave_sg)
+               return NULL;
+
        return chan->device->device_prep_slave_sg(chan, sgl, sg_len,
                                                  dir, flags, NULL);
 }
@@ -786,6 +792,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_rio_sg(
        enum dma_transfer_direction dir, unsigned long flags,
        struct rio_dma_ext *rio_ext)
 {
+       if (!chan || !chan->device || !chan->device->device_prep_slave_sg)
+               return NULL;
+
        return chan->device->device_prep_slave_sg(chan, sgl, sg_len,
                                                  dir, flags, rio_ext);
 }
@@ -796,6 +805,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
                size_t period_len, enum dma_transfer_direction dir,
                unsigned long flags)
 {
+       if (!chan || !chan->device || !chan->device->device_prep_dma_cyclic)
+               return NULL;
+
        return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
                                                period_len, dir, flags);
 }
@@ -804,6 +816,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_interleaved_dma(
                struct dma_chan *chan, struct dma_interleaved_template *xt,
                unsigned long flags)
 {
+       if (!chan || !chan->device || !chan->device->device_prep_interleaved_dma)
+               return NULL;
+
        return chan->device->device_prep_interleaved_dma(chan, xt, flags);
 }
 
@@ -811,7 +826,7 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_memset(
                struct dma_chan *chan, dma_addr_t dest, int value, size_t len,
                unsigned long flags)
 {
-       if (!chan || !chan->device)
+       if (!chan || !chan->device || !chan->device->device_prep_dma_memset)
                return NULL;
 
        return chan->device->device_prep_dma_memset(chan, dest, value,
@@ -824,6 +839,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_sg(
                struct scatterlist *src_sg, unsigned int src_nents,
                unsigned long flags)
 {
+       if (!chan || !chan->device || !chan->device->device_prep_dma_sg)
+               return NULL;
+
        return chan->device->device_prep_dma_sg(chan, dst_sg, dst_nents,
                        src_sg, src_nents, flags);
 }