History

dmaengine: imx-sdma: fix size check for sdma script_number

Illegal memory will be touch if SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V3 (41) exceed the size of structure sdma_script_start_addrs(40), thus cause memory corrupt such as slob block header so that kernel trap into while() loop forever in slob_free(). Please refer to below code piece in imx-sdma.c: for (i = 0; i < sdma->script_number; i++) if (addr_arr[i] > 0) saddr_arr[i] = addr_arr[i]; /* memory corrupt here */ That issue was brought by commit a572460be9cf ("dmaengine: imx-sdma: Add support for version 3 firmware") because SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V3 (38->41 3 scripts added) not align with script number added in sdma_script_start_addrs(2 scripts).

Robin Gong committed 7 years ago

Commit bd73dfa1 parent 9ec691f2 files · +11 −0Browse files

Unified · Split

2 files
  1. drivers/dma/imx-sdma.c +8 −0
  2. include/linux/platform_data/dma-imx-sdma.h +3 −0
drivers/dma/imx-sdma.c+8−0
@@ -1707,6 +1707,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma, · 1706 unmodified lines
17071707 if (!sdma->script_number)
17081708 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1;
17091709
1710+ if (sdma->script_number > sizeof(struct sdma_script_start_addrs)
1711+ / sizeof(s32)) {
1712+ dev_err(sdma->dev,
1713+ "SDMA script number %d not match with firmware.\n",
1714+ sdma->script_number);
1715+ return;
1716+ }
1717+
17101718 for (i = 0; i < sdma->script_number; i++)
17111719 if (addr_arr[i] > 0)
17121720 saddr_arr[i] = addr_arr[i];
include/linux/platform_data/dma-imx-sdma.h+3−0
@@ -51,7 +51,10 @@ struct sdma_script_start_addrs { · 50 unmodified lines
5151 /* End of v2 array */
5252 s32 zcanfd_2_mcu_addr;
5353 s32 zqspi_2_mcu_addr;
54+ s32 mcu_2_ecspi_addr;
5455 /* End of v3 array */
56+ s32 mcu_2_zqspi_addr;
57+ /* End of v4 array */
5558 };
5659
5760 /**

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t