lkml.org 
[lkml]   [2018]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 87/92] dmaengine: ensure dmaengine helpers check valid callback
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Vinod Koul <vinod.koul@intel.com>

    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 | 20 +++++++++++++++++++-
    1 file changed, 19 insertions(+), 1 deletion(-)

    --- a/include/linux/dmaengine.h
    +++ b/include/linux/dmaengine.h
    @@ -767,6 +767,9 @@ static inline struct dma_async_tx_descri
    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_descri
    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_descri
    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_descri
    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_descri
    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_descri
    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_descri
    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);
    }

    \
     
     \ /
      Last update: 2018-05-24 13:51    [W:4.892 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site