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;
それが実際にどんな「安全」を提供するのかしら。つまり、誤用を防ぐためですか?この場合、パラメーターはパブリックであるため、パラメーターを渡す必要がある場合でも、ライブラリーまたはアプリケーションはシステムコールを誤用する可能性があります。私は何を取りこぼしたか?
この質問は、このスーパーユーザーの質問で回答されています。
基本的に、アドレスのビットフリップは、実際にはreboot()
システムコールを呼び出しているときに、プログラムが1つのシステムコールを呼び出していると見なす可能性があります。 reboot()
は、システムの状態を消去する非常に破壊的な非同期操作であるため、プログラムエラーまたはパニックとして公開されるビットフリップ問題の証拠を消去します-Linux正常な使用に関する追加の保護が含まれています。
興味深いことに、マジック番号の2番目のセットは、Linusと彼の3人の娘の誕生日に対応しています。