Exemple de code Source à partir de “noyau Linux programmation”
a été la lecture de Robert l'Amour du livre, le chapitre 5 sur les syscalls, et trouvé ce simple exemple un peu douteux:
asmlinkage long sys_silly_copy(unsigned long *src, unsigned long *dst, unsigned long len)
{
unsigned long buf;
if (copy_from_user(&buf, src, len))
return -EFAULT;
...
}
Comme nous le voyons 'buf' est l'objet de type "unsigned long" et défini sur la pile du noyau, c'est à dire sa valeur initiale est susceptible d'ordures. De toute façon, est-il valable pour copier 'len octets dans la pile où buf est, c'est à dire qu'il pourrait écraser quelque chose d'utile? C'est peut-être bien que pour cet exemple particulier?
A l'air bien aussi longtemps que len == sizeof(unsigned long). Tout ce qui se passe est len octets de src sont écrits dans buf. Il suffit de ne pas len trop grandes ou de la ret adresse et d'autres structures importantes pourraient être écrasés
vous jamais compter sur vos appelants en suivant les règles, surtout si vous êtes le noyau. Si vous souhaitez garantir que la copie n'était que pour une seule ulong, vous pouvez utiliser
Je suis totalement d'accord. Bien sûr, c'est dangereux, à moins de len == sizeof(unsigned long) dans cet exemple précis.
vous jamais compter sur vos appelants en suivant les règles, surtout si vous êtes le noyau. Si vous souhaitez garantir que la copie n'était que pour une seule ulong, vous pouvez utiliser
sizeof(unsigned long)
dans les opérations de copie, plutôt que de len
. J'ai fourni une version plus sûre de ma réponse.Je suis totalement d'accord. Bien sûr, c'est dangereux, à moins de len == sizeof(unsigned long) dans cet exemple précis.
OriginalL'auteur Mark | 2011-06-29
Vous devez vous connecter pour publier un commentaire.
Il est très discutable. En fait, c'est carrément dangereux. Je vais donner à l'auteur le bénéfice du doute ici depuis qu'ils sont juste en essayant de montrer comment
copy_from_user
etcopy_to_user
travail, mais ils devraient vraiment ont fourni un exemple qui n'était pas si dangereux.Surtout depuis le livre cires lyrique sur la façon dont vous doit être très prudent:
et fournit un moyen pour l'utilisateur d'annihiler complètement le noyau 🙂
Le texte de l'exemplaire que j'ai etats:
Autres que la défaillance catastrophique de ne pas avoir vérifié les paramètres, je suis assez certain que le dernier paramètre de la
SYSCALL_DEFINE3
manque une virgule (même si c'était juste une faute de frappe).Un bien meilleur exemple, sans avoir à allouer de la mémoire arbitraire, serait le long des lignes de:
Quelqu'un essaie de mettre en place ce système d'appel serait bien avisé de se tenir à l'écart à partir de cet exemple particulier, dans le livre, bien que je suppose que, au strict minimum, il vous donnera quelques bonnes débogage du noyau de l'expérience 🙂
oui, vous avez raison, je l'ai changé à la forme correcte.
OriginalL'auteur paxdiablo
OriginalL'auteur user2264907