gpt4 book ai didi

c - Linux 内核从 kzalloc 取消引用 memset 中的 NULL 指针

转载 作者:行者123 更新时间:2023-12-02 05:24:56 33 4
gpt4 key购买 nike

很偶然地在内核丛林中偶然发现了一些代码,并且有点困惑。 kzalloc() 有两种实现:在 tools/virtio/linux/kernel.h 中和 linux/slab.h 中的主要一个。显然,大多数情况下使用第二种。但有时会使用“virtio”kzalloc()

“virtio”kzalloc() 看起来像这样:

static inline void *kzalloc(size_t s, gfp_t gfp)
{
void *p = kmalloc(s, gfp);

memset(p, 0, s);
return p;
}

我的困惑是,在“tools”目录中使用的“假”kmalloc() 可以返回 NULL 指针。而且看起来 memset() 实现不会检查 NULL 指针,因此可能会出现 NULL 指针取消引用。这是一个错误还是我遗漏了什么?

最佳答案

是的,这看起来确实像一个错误。

tools/ 子目录是用户空间工具的集合(顾名思义)。您还可以通过包含多个 C 标准库头文件来看到这一点。因此,这当然不是内核错误(否则会非常糟糕),只是 virtio 测试工具中的一个小疏忽。

那个virtio测试工具似乎重新定义了一些内核API来模拟它们在用户空间中的行为。但该函数似乎从未在实践中使用过,只是定义了而已。

marco:~/git/linux/tools/virtio$ grep -r kzalloc
linux/kernel.h:static inline void *kzalloc(size_t s, gfp_t gfp)
ringtest/ptr_ring.c:static inline void *kzalloc(unsigned size, gfp_t flags)
marco:~/git/linux/tools/virtio$

它可能是供那些希望在用户空间测试某些 virtio 内核代码的人使用的。

<小时/>

无论如何,你可以尝试 reporting the bugget_mantainer.pl 脚本建议:

$ perl scripts/get_maintainer.pl -f tools/virtio/linux/kernel.h
Bad divisor in main::vcs_assign: 0
"Michael S. Tsirkin" <mst@redhat.com> (maintainer:VIRTIO CORE AND NET DRIVERS)
Jason Wang <jasowang@redhat.com> (maintainer:VIRTIO CORE AND NET DRIVERS)
virtualization@lists.linux-foundation.org (open list:VIRTIO CORE AND NET DRIVERS)
linux-kernel@vger.kernel.org (open list)

关于c - Linux 内核从 kzalloc 取消引用 memset 中的 NULL 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786873/

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