Kiedy czytałem kod źródłowy Linuksa, a dokładniej kod wywołań systemowych, natknąłem się na sys_rebootimplementację: http://lxr.free-electrons.com/source/kernel/reboot.c#L199 .
199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200 void __user *, arg)
201 {
202 ...
...
286 }
Pośrodku znajduje się ten konkretny fragment kodu:
209
210 /* For safety, we require "magic" arguments. */
211 if (magic1 != LINUX_REBOOT_MAGIC1 ||
212 (magic2 != LINUX_REBOOT_MAGIC2 &&
213 magic2 != LINUX_REBOOT_MAGIC2A &&
214 magic2 != LINUX_REBOOT_MAGIC2B &&
215 magic2 != LINUX_REBOOT_MAGIC2C))
216 return -EINVAL;
Zastanawiam się, jakie to „bezpieczeństwo” faktycznie zapewnia. To znaczy, czy ma to zapobiec niewłaściwemu użyciu? W takim przypadku, ponieważ parametry są publiczne, każda biblioteka lub aplikacja może niewłaściwie używać wywołania systemowego, nawet jeśli są wymagane do przekazania parametrów. Co mnie ominęło?
getpidi tym podobnych, wszystkie mogą mieć nieprzewidywalne konsekwencje, jeśli zostaną niewłaściwie wykorzystane. A może wszystkie inne wywołania systemowe mają już wystarczającą liczbę parametrów, aby je sprawdzić, aby były nieszkodliwe, jeśli zostaną źle wywołane. Wydaje mi się to jednak dziwnym pomysłem „bezpieczeństwa”…