spi: spi-mt65xx: Fix NULL pointer access in interrupt handler
authorFei Shao <fshao@chromium.org>
Thu, 21 Mar 2024 07:08:57 +0000 (15:08 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 21 Mar 2024 11:28:21 +0000 (11:28 +0000)
The TX buffer in spi_transfer can be a NULL pointer, so the interrupt
handler may end up writing to the invalid memory and cause crashes.

Add a check to trans->tx_buf before using it.

Fixes: 1ce24864bff4 ("spi: mediatek: Only do dma for 4-byte aligned buffers")
Signed-off-by: Fei Shao <fshao@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://msgid.link/r/20240321070942.1587146-2-fshao@chromium.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-mt65xx.c

index 8d4633b353eef662b224c966f7b9d9ba7527e076..e4cb22fe007523a3e07551fc86c126213330be16 100644 (file)
@@ -788,17 +788,19 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
                mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, len);
                mtk_spi_setup_packet(host);
 
-               cnt = mdata->xfer_len / 4;
-               iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
-                               trans->tx_buf + mdata->num_xfered, cnt);
+               if (trans->tx_buf) {
+                       cnt = mdata->xfer_len / 4;
+                       iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
+                                       trans->tx_buf + mdata->num_xfered, cnt);
 
-               remainder = mdata->xfer_len % 4;
-               if (remainder > 0) {
-                       reg_val = 0;
-                       memcpy(&reg_val,
-                               trans->tx_buf + (cnt * 4) + mdata->num_xfered,
-                               remainder);
-                       writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+                       remainder = mdata->xfer_len % 4;
+                       if (remainder > 0) {
+                               reg_val = 0;
+                               memcpy(&reg_val,
+                                       trans->tx_buf + (cnt * 4) + mdata->num_xfered,
+                                       remainder);
+                               writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+                       }
                }
 
                mtk_spi_enable_transfer(host);