0

ロード可能なカーネル モジュールによって作成された /proc ファイルを書き込もうとしています。fopen() を使用してファイルを書き込み用に開いていますが、errno : 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;
}

これを克服する方法について何か提案はありますか?

ありがとう。

4

1 に答える 1

2

最も可能性の高い答えは、作成された procfs ノードがユーザーに対して正しい権限を持っていないことです。

root として実行すると、ノードのパーミッション チェックのほとんどがバイパスされるため、エラーは発生しません (例外があります。これは一般的なケースです)。

カーネルローダブルモジュールで、procfs ノードを作成します (.c ファイルのどこかに):

create_proc_entry(...)

必要なオープン オプションをサポートするために、2 番目のパラメーターであるモードが、root 以外のユーザーによる書き込み用のオープンを許可するものに設定されていることを確認する必要があります。たとえば0666、ファイルを誰でも R/W としてグローバルに開くことができるようにします。

一般に、procfs のノードはフラグ付きで作成されます0444(つまり、すべてのユーザーに対して R/O のみ)。モードで作成されたもの0644(root による R/W、他のすべてのユーザーの R/O) もあれば、パーミッション付きで作成されたもの0400(root の R/O、その他はすべて離れたまま) もあります。

于 2012-02-13T20:29:12.977 に答える