The code in Linux kernel (maybe a driver):
checks the size of *data_ptr
sizeof(*data_ptr)
like this:
uint32_t *data_ptr = cfg_data +
reg_cfg_cmd->u.rw_info.cmd_data_offset/4;
if ((UINT_MAX - sizeof(*data_ptr) <
reg_cfg_cmd->u.rw_info.reg_offset) ||
(resource_size(vfe_dev->vfe_mem) <
reg_cfg_cmd->u.rw_info.reg_offset +
sizeof(*data_ptr))) {
pr_err("%s: VFE_WRITE_MB: Invalid length\n", __func__);
return -EINVAL;
}
Is the size of
uint32_t *data_ptr
undetermined? It seems that it should always be 4 bytes.
Updated:
If so, what is the meaning of
UINT_MAX - sizeof(*data_ptr)
?
Actually it is a security check, and a vulnerability occurs here. The code is later patched in: