Когда я читал исходный код Linux и, в частности, системные вызовы кода, я столкнулся с sys_reboot
реализацией: 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 }
В середине есть этот конкретный кусок кода:
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;
Интересно, какую «безопасность» он на самом деле обеспечивает. Я имею в виду, чтобы предотвратить злоупотребление? В этом случае, поскольку параметры являются общедоступными, любая библиотека или приложение могут неправильно использовать системный вызов, даже если они необходимы для передачи параметров. Что я пропустил?
getpid
и тому подобного, конечно, все они могут иметь непредсказуемые последствия при неправильном использовании. Или, может быть, все другие системные вызовы уже имеют достаточно параметров для проверки, чтобы сделать их безвредными, если они вызваны неправильно. Хотя мне кажется странным представление о «безопасности» ...