【发布时间】:2016-09-17 05:18:18
【问题描述】:
Linux内核中的代码(可能是驱动):
检查 *data_ptr 的大小
sizeof(*data_ptr)
像这样:
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;
}
是大小
uint32_t *data_ptr
不确定?好像应该永远是4个字节。
更新:
如果是,那是什么意思
UINT_MAX - sizeof(*data_ptr)
?
其实是安全检查,这里出现漏洞。代码稍后修补:
【问题讨论】:
-
Yes
sizeof(*data_ptr)应该始终为 4。但最好使用sizeof而不是硬编码为 4。例如,如果data_ptr的类型发生变化,则使用 @987654330 的代码@ 无需更改即可工作,但如果将其替换为硬编码值,则不会。 -
补丁通过引入代码重复使代码变得更糟(
uint32_t出现两次,因此如果有人更改数据类型,错误检查可能与代码不同步)。似乎该补丁具有将错误检查提升到不同位置的正确想法,但它不应该对sizeof表达式进行此特定更改。此外,整本书很难阅读,我个人会将其排版,以便读者一眼就能验证支票。 -
那是一个丑陋的...如果声明就在那里。肯定是 Linux 内核。
标签: c linux pointers driver sizeof