récupère fd du pointeur de fichier dans l’espace du kernel

Avec un fichier struct, est-il possible d’obtenir le descripteur de fichier associé dans l’espace kernel Linux? J’essaie de modifier les permissions à l’aide de sys_chmod ou de sys_fchmod. L’un prend un descripteur de fichier, l’autre attend un nom de fichier de l’espace utilisateur. Je peux comprendre comment obtenir le nom du fichier, mais comment puis-je le convertir en un pointeur d’espace utilisateur?

Merci

    La fonction que vous recherchez est chmod_common :

     static int chmod_common(struct path *path, umode_t mode) 

    Ce qui prend un path et le mode que vous voulez définir. Malheureusement, comme vous l’avez remarqué, c’est statique et n’est évidemment pas exporté. Donc, vous pouvez aller de plusieurs façons:

    • Répliquez ce que vous faites dans une fonction de votre choix
    • Récupère “le descripteur de fichier” à partir du struct file (moche)
    • Trouver un moyen d’appeler sys_chmod

    Maintenant, sys_chmod attend un pointeur utilisateur mais vous êtes dans le kernel. Voici ce que vous pourriez faire pour le duper:

     mm_segment_t oldfs = get_fs(); char __user *userptr; userptr = (char __user __force *) kernptr; set_fs(KERNEL_DS); /* call sys_chmod */ set_fs(oldfs); 

    Tout cela est parfaitement en ligne avec “des choses que vous ne devriez jamais faire dans le kernel” .