Получить fd из указателя файла в пространстве ядра

При наличии файла структуры возможно ли получить связанный файловый дескриптор в пространстве ядра Linux? Я пытаюсь изменить разрешения с помощью sys_chmod или sys_fchmod. Один берет дескриптор файла, другой ожидает имя файла из пространства пользователя. Я могу понять, как получить имя файла, но как я приведу его к указателю пространства пользователя?

Спасибо

1 ответ

Решение

Функция, которую вы ищете chmod_common:

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

Который занимает path и режим, который вы хотите установить. К сожалению, как вы заметили, он статический и явно не экспортируется. Таким образом, вы можете пойти несколькими путями:

  • Копируйте все, что он делает, в своей собственной функции
  • Получить "дескриптор файла" из struct file (Некрасиво)
  • Найдите способ позвонить sys_chmod

Сейчас sys_chmod ожидает указатель пользователя, но вы в ядре. Вот что вы можете сделать, чтобы обмануть это:

mm_segment_t oldfs = get_fs();

char __user *userptr;
userptr = (char __user __force *) kernptr;

set_fs(KERNEL_DS);

/* call sys_chmod */

set_fs(oldfs);

Все это во многом соответствует "вещам, которые вы никогда не должны делать в ядре".

Другие вопросы по тегам