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 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