首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于大小的copy_from_user警告是否正确?

关于大小的copy_from_user警告是否正确?
EN

Stack Overflow用户
提问于 2012-04-03 13:07:34
回答 1查看 3.2K关注 0票数 1

我在编译内核模块时遇到了一个无法工作的警告。

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

代码语言:javascript
复制
#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;
}

我得到的警告如下:

警告:调用带有属性警告的“copy_from_user_overflow”声明: copy_from_user()缓冲区大小不正确

正如你所看到的,这是完全错误的。我所读的数据的amount是非常好的!我发现此链接说可以在最后一个参数中使用min来沉默gcc,但它对我没有用(我写道:

代码语言:javascript
复制
if (copy_from_user(command, buf, min((unsigned long)amount, count)))

无济于事)

,有人知道如何让gcc知道这很酷,不应该担心吗?

发生这种情况的另一个地方如下所示:

代码语言:javascript
复制
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也给了我同样的警告,尽管这肯定是正确的。

这是确切的错误:

代码语言:javascript
复制
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 (如您所见)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-03 18:51:45

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

代码语言:javascript
复制
min((unsigned long)amount, count)

使用

代码语言:javascript
复制
min((unsigned long)READ_CHUNK, count)

现在,可以证明在编译时拷贝大小不会超过100字节,从而使gcc相信我们永远不会覆盖目标缓冲区command,它也是100字节。

在第二个示例中,编译时既不知道read_buffer也不知道count。如果不希望此错误使您陷入困境,则需要将编译时可计算参数(目标缓冲区和复制大小)发送到copy_from_user

如果您检查主流linux内核,您将很难找到它们将用户空间数据写入内核内的恶意缓冲区的示例。因此,我想,如果您的代码必须是完全安全的,则需要消除缓冲区的错误设置。

PS:阅读gcc如何实现一种有限的缓冲区溢出保护机制,以防止某些缓冲区溢出攻击。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9993929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档