Linux разыменование NULL-указателя ядра в memset из kzalloc - PullRequest
7 голосов
/ 17 января 2020

Совершенно случайно наткнулся на некоторый код в джунглях ядра и был немного смущен. Существует две реализации 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;
}

Я путаюсь с тем, что "fake" kmalloc(), используемый внутри каталога "tools", может возвращать NULL-указатель. Также похоже, что реализация memset() не проверяет NULL-указатели, поэтому может быть разыменование NULL-указателя. Это ошибка или я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Да, это определенно похоже на ошибку.

Подкаталог 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 в пользовательском пространстве.


В любом случае, вы можете попробовать сообщить об ошибке . Сценарий get_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)
3 голосов
/ 17 января 2020

Заголовок в основном используется для тестирования пользовательского пространства, например virtio_test.

Из журнала git tools/virtio/virtio_test.c:

Это часть пользовательского пространства инструмента: он включает в себя несколько заглушек для linux API, несколько похожих на linuxsched. Это позволяет перекомпилировать код вызова в пользовательском пространстве.

Реализован небольшой тестовый пример, объединяющий это с модулем vhost_test.

Так что да, код немного небезопасен (чисто кодирование проверяет указатель NULL до memset() и выдает соответствующее сообщение об ошибке), но, поскольку это всего лишь инструмент тестирования, кажется, что считалось некритическим пропускать этот тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...