Re: [PATCH] dmaengine: ensure dmaengine helpers check valid callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/04/16 16:47, Vinod Koul wrote:
> 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@xxxxxxxxxx>
> Signed-off-by: Vinod Koul <vinod.koul@xxxxxxxxx>
> ---
>  include/linux/dmaengine.h | 20 +++++++++++++++++++-
>  1 file changed, 19 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
> index 017433712833..30de0197263a 100644
> --- a/include/linux/dmaengine.h
> +++ b/include/linux/dmaengine.h
> @@ -804,6 +804,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);
>  }
> @@ -812,6 +815,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);
>  }
> @@ -823,6 +829,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);
>  }
> @@ -833,6 +842,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);
>  }
> @@ -841,6 +853,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);
>  }
>  
> @@ -848,7 +863,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,
> @@ -861,6 +876,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);
>  }

My only thought here is if the pointer for chan is valid, should this
imply that the pointer for chan->device should also be valid? In other
words, do we need to check for both?

I see that today in dma_async_device_register() we do not check that
chan->device is populated for each channel, but I am wondering if we
should and if it is not return an error?

Cheers
Jon






-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------
--
To unsubscribe from this list: send the line "unsubscribe dmaengine" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux