Linux 重启系统调用中的“魔法参数”有什么用?

Linux 重启系统调用中的“魔法参数”有什么用?

当我阅读 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;

我想知道它实际上提供了什么样的“安全”。我的意思是,这是为了防止滥用吗?在这种情况下,由于参数是公共的,任何库或应用程序都可能滥用系统调用,即使它们需要传递参数。我错过了什么?

答案1

这个问题已在此超级用户问题中得到回答:

基本上,地址中的一位翻转可能会导致程序认为它正在调用一个系统调用,而实际上它正在调用该reboot()系统调用。因为reboot()这是一个非常具有破坏性的非同步操作,它会擦除​​系统的状态 - 从而擦除位翻转问题的证据,否则这些问题可能会作为程序错误或恐慌而暴露 - Linux 围绕其成功使用提供了额外的保护。

有趣的是,第二组神奇数字对应于莱纳斯和他的三个女儿的生日:

相关内容