Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c89cc73 authored by Dan Carpenter's avatar Dan Carpenter Committed by Vinod Koul
Browse files

dmaengine: jz4780: Fix an endian bug in IRQ handler



The "pending" variable was a u32 but we cast it to an unsigned long
pointer when we do the for_each_set_bit() loop.  The problem is that on
big endian 64bit systems that results in an out of bounds read.

Fixes: 4e4106f5 ("dmaengine: jz4780: Fix transfers being ACKed too soon")
Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent d1fdb6d8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -718,12 +718,13 @@ static irqreturn_t jz4780_dma_irq_handler(int irq, void *data)
{
	struct jz4780_dma_dev *jzdma = data;
	unsigned int nb_channels = jzdma->soc_data->nb_channels;
	uint32_t pending, dmac;
	unsigned long pending;
	uint32_t dmac;
	int i;

	pending = jz4780_dma_ctrl_readl(jzdma, JZ_DMA_REG_DIRQP);

	for_each_set_bit(i, (unsigned long *)&pending, nb_channels) {
	for_each_set_bit(i, &pending, nb_channels) {
		if (jz4780_dma_chan_irq(jzdma, &jzdma->chan[i]))
			pending &= ~BIT(i);
	}