gpt4 book ai didi

c - 为什么在 Linux hwmon 中允许可能存在缓冲区溢出的 sprintf?

转载 作者:IT王子 更新时间:2023-10-29 01:13:02 27 4
gpt4 key购买 nike

我已经看到以下代码片段在 Linux hwmon 设备上重复使用:

return sprintf(buf, "%d\n", in_input);

其中buf是指向char char *buf的指针,in_input通常是intu16。目的是将从设备读回的值复制到为此设备属性创建的 sysfs 文件。

例如,您可以查看 Linux/drivers/hwmon/mcp3021.c (或者实际上是 4.9 内核之前的任何 hwmon 设备)。您可以看到第 81 行的函数返回一个 u16,而在第 99 行,代码将 u16 存储到 char *buf 中。

 81 static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
82 {
83 return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
84 }
85
86 static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
87 char *buf)
88 {
89 struct i2c_client *client = to_i2c_client(dev);
90 struct mcp3021_data *data = i2c_get_clientdata(client);
91 int reg, in_input;
92
93 reg = mcp3021_read16(client);
94 if (reg < 0)
95 return reg;
96
97 in_input = volts_from_reg(data, reg);
98
99 return sprintf(buf, "%d\n", in_input);
100 }

这段代码不会总是导致缓冲区溢出吗?我们总是将 u16 存储到分配给 char 8 位的缓冲区中。为什么在 Linux 设备驱动程序中允许这样做?

请注意,对于执行完全相同操作的我的驱动程序,sysfs 会正确显示返回值,即使它不可能存储为 char(8 位)。所以想知道 char * 表示是否不准确?

最佳答案

根据 sysfs.txt 中的文档,传递给 show 函数的缓冲区大小为 PAGE_SIZE:

sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the method. Sysfs will call the method exactly once for each read or write.

由于 PAGE_SIZE 肯定大于一个小整数的长度,因此实际上不存在缓冲区溢出的可能性。

关于c - 为什么在 Linux hwmon 中允许可能存在缓冲区溢出的 sprintf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41645658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com