Errno: 13 при использовании fopen при входе в процесс - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь записать файл / proc, созданный загружаемым модулем ядра. Я использую fopen (), чтобы открыть файл для записи, но получаю сообщение об ошибке: 13 (разрешение отклонено).

FILE *fp;
fp = fopen("/proc/file1","w");
if(fp == NULL){
     printf("Errno : %d",errno); // prints 13
}

The LKM contains the following code:

static struct proc_dir_entry *proc_entry;

static ssize_t proc_write(struct file *filp, const char __user *buff, unsigned long len, void *data)
{  
    // code writes from buffer to local variable

    return len;
}

static ssize_t proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
    // code for reading file

    return 0;
}


int proc_open(struct inode *inode, struct file *file)
{
    try_module_get(THIS_MODULE);
    return 0;
}

int proc_close(struct inode *inode, struct file *file)
{
    module_put(THIS_MODULE);
    return 0;
}

Какие-нибудь предложения о том, как преодолеть это?

Спасибо.

1 Ответ

2 голосов
/ 14 февраля 2012

Наиболее вероятный ответ: созданный узел procfs не имеет правильных прав доступа для пользователя.

При запуске от имени root он пропускает большую часть проверки прав доступа для узла, поэтому вы не получаете сообщение об ошибке (есть исключения; это общий случай).

в загружаемом модуле ядра, где он создает узел procfs (где-то в файле .c):

create_proc_entry(...)

Вам необходимо убедиться, что для второго параметра режим установлен что-то, что позволяет открывать для записи пользователям, отличным от root, для поддержки желаемой опции открытия; например 0666 делает файл доступным для всех пользователей как R / W.

Обычно узлы в procfs создаются с флагами 0444 (т. Е. R / O только для всех пользователей). Некоторые создаются в режиме 0644 (R / W для root, R / O для всех остальных пользователей), некоторые создаются с разрешениями 0400 (R / O для root, все остальные остаются в стороне).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...