Qual é o uso de "argumentos mágicos" na chamada de sistema de reinicialização do Linux?

10

Enquanto lia o código fonte do Linux, e mais especificamente o sistema chama o código, me deparei com a sys_rebootimplementação: 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 }

No meio, há este trecho de código específico:

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;

Eu me pergunto que tipo de "segurança" ele realmente oferece. Quero dizer, é para evitar uso indevido? Nesse caso, como os parâmetros são públicos, qualquer biblioteca ou aplicativo pode usar indevidamente a chamada do sistema, mesmo que seja necessário passar os parâmetros. Do que eu senti falta?

lgeorget
fonte
Provavelmente é para ligações acidentais, por exemplo, corrupção de memória ou erro de digitação em um número de syscall. Se isso é algo que vale a pena se preocupar, não sei.
21814 derobert
@derobert Faz sentido, mas ... todas as chamadas do sistema não precisariam de uma proteção como essa? Exceto getpide similares, é claro, todos eles podem ter consequências imprevisíveis se mal utilizados. Ou talvez, todos os outros syscalls já tenham parâmetros suficientes para serem verificados para torná-los inofensivos se forem chamados incorretamente. Parece uma idéia estranha de "segurança" para mim, ...
lgeorget 19/07/2014
De fato. Não tenho certeza se a certa altura Linus estava perseguindo um bug que mantinha # $ & #! reiniciar sua máquina ou se alguém a adicionou porque era paranóica etc. O que ela deve proteger é bastante claro; por que a proteção disso é necessária é uma boa pergunta.
21814 derobert
@derobert Possivelmente um resquício de alguém acostumado a circuitos integrados, onde muitos chips implementam algum tipo de proteção para ativar a funcionalidade de desligamento (você deve gravar bits XYZ em um registro especial antes que a instrução de desligamento funcione, por exemplo). Não tenho certeza se os prazos para que isso faz sentido, porém,
mbrig

Respostas:

10

Esta pergunta foi respondida nesta pergunta de superusuário:

Basicamente, um pequeno toque em um endereço pode fazer com que um programa pense que está chamando uma chamada de sistema quando, na verdade, está chamando a reboot()chamada de sistema. Como reboot()é uma operação muito destrutiva e sem sincronização, que apaga o estado do sistema - apagando assim as evidências do problema de inversão de bits que, de outra forma, seria exposto como um erro ou pânico no programa - o Linux inclui proteções extras ao seu uso bem-sucedido .

Curiosamente, o segundo conjunto de números mágicos corresponde aos aniversários de Linus e suas três filhas:

assustador
fonte
1
Ah, não pensei em verificar os outros sites. Eu nunca pensei que essa pergunta pudesse pertencer a não ser aqui. De qualquer forma, obrigado pela sua resposta. :-)
lgeorget