GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-Kernel-NULL-Zeiger-Dereferenzierung in Memset von kzalloc

Der Header wird hauptsächlich für Userspace-Tests verwendet, wie z. B. virtio_test .

Aus dem Git-Log von tools/virtio/virtio_test.c :

Dies ist der Userspace-Teil des Tools:Er enthält eine Reihe von Stubs für Linux-APIs, ähnlich wie Linuxsched. Dadurch ist es möglich, den Ringcode im Userspace neu zu kompilieren.

Kombiniert mit vhost_testmodule.

wird ein kleines Testbeispiel implementiert

Also ja, der Code ist etwas unsicher (saubere Codierung würde auf NULL testen Zeiger vor memset() und mit einer entsprechenden Fehlermeldung abspringen), aber da es sich nur um ein Testwerkzeug handelt, scheint es als unkritisch angesehen worden zu sein, diesen Test zu überspringen.


Ja, das sieht definitiv nach einem Bug aus.

Die tools/ Unterverzeichnis ist eine Sammlung von User-Space-Tools (wie der Name schon sagt). Sie können dies auch daran erkennen, dass mehrere Header der C-Standardbibliothek enthalten sind. Das ist also natürlich kein Kernel-Fehler (das wäre sehr schlimm gewesen), nur ein kleines Versehen in virtio Testwerkzeug.

Diese virtio Das Testing-Tool scheint einige Kernel-APIs neu zu definieren, um ihr Verhalten im Userspace zu verspotten. Diese Funktion scheint jedoch in der Praxis nie verwendet zu werden, sondern lediglich definiert zu sein.

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$

Es ist wahrscheinlich für jemanden gedacht, der etwas Virtio-Kernel-Code im Userspace testen möchte.

In jedem Fall können Sie versuchen, den Fehler zu melden. Die get_mantainer.pl Skript schlägt vor:

$ perl scripts/get_maintainer.pl -f tools/virtio/linux/kernel.h
Bad divisor in main::vcs_assign: 0
"Michael S. Tsirkin" <[email protected]> (maintainer:VIRTIO CORE AND NET DRIVERS)
Jason Wang <[email protected]> (maintainer:VIRTIO CORE AND NET DRIVERS)
[email protected] (open list:VIRTIO CORE AND NET DRIVERS)
[email protected] (open list)

Linux
  1. Wie lade ich Linux-Kernel-Module aus C-Code?

  2. Wie funktioniert copy_from_user aus dem Linux-Kernel intern?

  3. Rufen Sie eine Userspace-Funktion innerhalb eines Linux-Kernel-Moduls auf

  4. Warum den Linux-Kernel vor dem Root-Benutzer schützen?

  5. Linux Kernel ROP - Rückkehr zum Userland aus dem Kernel-Kontext?

Dmesg-Befehl unter Linux

Sysctl-Befehl unter Linux

Ist Linux ein Betriebssystem oder ein Kernel?

Linux-Kernel vs. Mac-Kernel

So erstellen Sie einen Linux-Kernel von Grund auf neu

So kompilieren Sie den Linux-Kernel aus der Quelle, um einen benutzerdefinierten Kernel zu erstellen