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).
Unified · Split
| @@ -1707,6 +1707,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma, · 1706 unmodified lines | |||
| 1707 | if (!sdma->script_number) | 1707 | if (!sdma->script_number) |
| 1708 | sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; | 1708 | sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; |
| 1709 | 1709 | ||
| 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 | |||
| 1710 | for (i = 0; i < sdma->script_number; i++) | 1718 | for (i = 0; i < sdma->script_number; i++) |
| 1711 | if (addr_arr[i] > 0) | 1719 | if (addr_arr[i] > 0) |
| 1712 | saddr_arr[i] = addr_arr[i]; | 1720 | saddr_arr[i] = addr_arr[i]; |
| @@ -51,7 +51,10 @@ struct sdma_script_start_addrs { · 50 unmodified lines | |||
| 51 | /* End of v2 array */ | 51 | /* End of v2 array */ |
| 52 | s32 zcanfd_2_mcu_addr; | 52 | s32 zcanfd_2_mcu_addr; |
| 53 | s32 zqspi_2_mcu_addr; | 53 | s32 zqspi_2_mcu_addr; |
| 54 | s32 mcu_2_ecspi_addr; | ||
| 54 | /* End of v3 array */ | 55 | /* End of v3 array */ |
| 56 | s32 mcu_2_zqspi_addr; | ||
| 57 | /* End of v4 array */ | ||
| 55 | }; | 58 | }; |
| 56 | 59 | ||
| 57 | /** | 60 | /** |