gpt4 book ai didi

copy_from_user 关于大小的警告不能证明是正确的?

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:19 25 4
gpt4 key购买 nike

我在编译我的内核模块时遇到了一个警告,我无法解决这个问题。

首先看一下这个简化的代码:

#define READ_CHUNK 100u
static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data)
{
char command[READ_CHUNK];
unsigned long left = count;
while (left > 0)
{
unsigned int amount = left<READ_CHUNK?left:READ_CHUNK;
if (copy_from_user(command, buf, amount))
return -EFAULT;
buf += amount;
left -= amount;
/* process buffer */
}
return count;
}

我收到的警告如下:

warning: call to ‘copy_from_user_overflow’ declared with attribute warning: copy_from_user() buffer size is not provably correct

如您所见,这是完全错误的。 数量 我读取的数据证明是好的!我找到了 this linkmin 可以在最后一个参数中使用来使 gcc 静音,但它对我不起作用(我写道:

if (copy_from_user(command, buf, min((unsigned long)amount, count)))

无济于事)。

有谁知道如何让 gcc 知道这很酷并且不用担心?


另一个发生这种情况的地方是这样的:

static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data)
{
char *read_buffer = vmalloc(count * sizeof(*read_buffer));
if (read_buffer == NULL)
return -ENOMEM;
if (copy_from_user(read_buffer, buf, count))
{
vfree(read_buffer);
return -EFAULT;
}
/* process buffer */
vfree(read_buffer);
return count;
}

在这种情况下,gcc 也给了我同样的警告,即使它肯定是正确的。


这是确切的错误:

In file included from /usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess.h:571:0,
from <my source file>:7:
/usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess_32.h: In function ‘copy_from_user’:
/usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess_32.h:212:26: warning: call to ‘copy_from_user_overflow’ declared with attribute warning: copy_from_user() buffer size is not provably correct

内核版本:2.6.35.9 打了rtai补丁(如你所见)

最佳答案

在您的第一个示例中,尝试替换

min((unsigned long)amount, count)

min((unsigned long)READ_CHUNK, count)

现在,可以证明副本大小在编译时本身 不会超过 100 字节,因此说服 gcc 我们永远不会覆盖目标缓冲区 command 这是也是 100 个字节。

在你的第二个例子中,read_buffercount 在编译时都是未知的。如果您不想让这个错误困扰您,您需要编译时可评估参数(目标缓冲区和副本大小)发送到copy_from_user

如果你查看主线 linux 内核,你几乎找不到将用户空间数据写入内核内部分配缓冲区的示例。所以我想,如果您的代码必须绝对安全,您需要取消缓冲区的 mallocing

PS:了解 gcc 如何实现有限的 buffer overflow protection可以防止某些缓冲区溢出攻击的机制。

关于copy_from_user 关于大小的警告不能证明是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993929/

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