web-dev-qa-db-ja.com

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;

それが実際にどんな「安全」を提供するのかしら。つまり、誤用を防ぐためですか?この場合、パラメーターはパブリックであるため、パラメーターを渡す必要がある場合でも、ライブラリーまたはアプリケーションはシステムコールを誤用する可能性があります。私は何を取りこぼしたか?

10
lgeorget

この質問は、このスーパーユーザーの質問で回答されています。

基本的に、アドレスのビットフリップは、実際にはreboot()システムコールを呼び出しているときに、プログラムが1つのシステムコールを呼び出していると見なす可能性があります。 reboot()は、システムの状態を消去する非常に破壊的な非同期操作であるため、プログラムエラーまたはパニックとして公開されるビットフリップ問題の証拠を消去します-Linux正常な使用に関する追加の保護が含まれています。

興味深いことに、マジック番号の2番目のセットは、Linusと彼の3人の娘の誕生日に対応しています。

10
hrunting