实测以魅蓝Note2为例,该问题可能存在于其他MTK系列中。本文代码以MediaTek-HelioX10-Kernel为例。
MTK dispsys驱动通过/dev/mtk_disp_mgr设备文件和用户态应用通信,由于未进行有效过滤导致内核崩溃。
驱动在处理DISP_IOCTL_WRITE_REG请求时,会接受长度为12字节的参数,结构如下:
之后会在_color_io函数中进行如下操作:
首先会通过color_pa2va函数进行地址转换,如果传入的wParams.reg为0或者为不存在的pa, 会返回0。
如果color_is_reg_addr_valid返回1,会将用户控制的wParams参数传入_color_reg_mask函数中。
由于dispsys_reg[x]在灭屏时会含有0值,color_is_reg_addr_valid函数实际会返回1。并将用户提供的DISP_WRITE_REG参数传入_color_reg_mask引起内核崩溃,例如空指针或者内存对齐(需要DISP_WRITE_REG.reg在TDSHP_PA_BASE或者TDSHP1_PA_BASE区间中)引起的Oops。
Oops日志: