来自 kzalloc 的 memset 中的 Linux 内核空指针取消引用

red*_*0ct 7 c linux memset linux-kernel kmalloc

很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现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;
}
Run Code Online (Sandbox Code Playgroud)

我的困惑是kmalloc()在“tools”目录中使用的“fake”会返回 NULL 指针。此外,该memset()实现似乎不检查 NULL 指针,因此可能存在 NULL 指针取消引用。这是一个错误还是我错过了什么?

Mar*_*lli 3

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

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$
Run Code Online (Sandbox Code Playgroud)

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


无论如何,您可以尝试报告该错误。脚本get_mantainer.pl建议:

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$
Run Code Online (Sandbox Code Playgroud)