Получить 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);
Все это во многом соответствует "вещам, которые вы никогда не должны делать в ядре".