Eine Antwort: Nein, weil Sicherheitsfragen im Kernel nie irrelevant sind.
memcpy()
insbesondere ist eine schlechte Funktion zu verwenden, da das dritte Argument eine signierte ganze Zahl ist. Wenn der Benutzer den Wert dieses dritten Parameters in irgendeiner Weise beeinflussen kann, öffnen Sie sich für schwerwiegende Haftungsfragen, wenn jemand versucht, eine negative Anzahl von Bytes zu kopieren.
Viele eine ernsthafte Pufferüberlauf Fehler wurden aufgrund der signierten-ness von memcpy()
Eine andere Antwort: Nein, weil copy_to_user()
und copy_from_user()
nicht nur access_ok()
tun. Diese ersten beiden Funktionen stellen sicher, dass die Kopie, die Sie gerade erreichen möchten, erfolgreich ist oder fehlerhaft ausgeführt wird. Dies ist nicht, was access_ok()
für Sie tut. Die Dokumentation für access_ok()
sagt ausdrücklich, dass diese Funktion nicht, dass der Speicher garantiert Zugriffe erfolgreich sein wird tatsächlich:
Note that, depending on architecture, this function probably just
checks that the pointer is in the user space range - after calling
this function, memory access functions may still return -EFAULT.
Zum Beispiel meine jüngste Quellcode hat, für x86, Laufzeit überprüft, dass geht über access_ok()
: https://lwn.net/Articles/612153/
Noch eine dritte Antwort: memcpy()
wahrscheinlich nicht viel effizienter ist. Sie könnten hier und da ein paar Anweisungen im Prinzip speichern, aber diese Anweisungen zum Einrichten und Überprüfen werden vernachlässigbar sein, wenn Sie mehr als nur die kleinsten Datenmengen kopieren.