2016-11-09 2 views
0

私の目標は、プロセスのオープンファイル記述子のアクセス許可を変更することです。たとえば、PIDが既知のプロセスがあり、標準から3つ離れた2つのファイル記述子があります.1つは読み取り専用アクセス権でオープンされ、もう1つは書き込み専用アクセス権でオープンされました。私は、ファイルディスクリプタのアクセス権を読み取り専用から読み取りと書き込みに変更したい。その後、ファイルディスクリプタを使用して、作成されたオブジェクトを書き込むことができます。理解Linuxカーネルのデータ構造ファイルディスクリプタを処理するための

私は私にそのPIDで識別されるプロセスのファイル記述子へのアクセスを提供するカーネルモジュールを書かれています。ヘッダーとフォーラムを検索して、ファイル記述子を処理するためのLinuxのデータ構造の仕組みを理解しましたが、私はまだ混乱しています。私が見つけたことは、すべてのプロセスがオープンファイル記述子の配列が含ま下に開いているすべてのファイルのためのメンバーを、含まれている独自のtask_structを、持っている、です。私はここからinodeとどのようにリンクしているのか分かりません。

私は私達に権限を与えますが、私はそれを呼び出すための方法を見つけることができませんf_modeと呼ばれる構造体ファイルのメンバーがあることが分かりました。私はそれを直接アクセスすると、それは私にunsigned intを与えますが、どの値が何にマップされているのかわかりません。また、アクセス権限を格納するデータメンバーであるかどうかはわかりません。これを変更すると、ファイル記述子のアクセス権が変更されますか?

コードは以下のとおりである:

static int __init mainInit(void){ 

    int pid=13433; 
    struct task_struct * task; 
    struct files_struct * files; 
    struct fdtable * filestable; 
    struct path files_path; 

    //Get Task structure from PID 
    task = pid_task(find_vpid(pid), PIDTYPE_PID); 
    //Get open FIles from the task tstructure 
    files = task->files; 

    filestable=files_fdtable(files); 

    int i=0; 
    char *cwd; 
    char *buf = (char *)kmalloc(GFP_KERNEL,100*sizeof(char)); 

    while(filestable->fd[i] != NULL){ 
     files_path = filestable->fd[i]->f_path; 
     cwd=d_path(&files_path,buf, 100*sizeof(char)); 

     printk(KERN_INFO "Open FD with %d with name %s with access %x\n", i, cwd,filestable->fd[i]->f_mode); 

     //printk(KERN_INFO "FMode read:%x Fmodewrite:%x\n",FMODE_READ,FMODE_WRITE); 


     //Check access mode 
     if(filestable->fd[i]->f_mode==FMODE_READ){ 
      printk(KERN_INFO "File has access FMODE_READ\n"); 
     }else if(filestable->fd[i]->f_mode==FMODE_WRITE){ 
      printk(KERN_INFO "File has access FMODE_WRTIE\n"); 
     } 
     i++; 
    } 
    return 0; 
} 

static void __exit mainExit(void){ 
    printk(KERN_INFO "Goodbye Kernel!. Returning to normal useless world!\n"); 
} 

module_init(mainInit); 
module_exit(mainExit); 

答えて

0

考えは間違っていると、コードが間違っています。実際の目標は何ですか?なぜファイルが書き込み用に開かれていないのですか?プログラムが明示的に読み込み用に開いた場合、プログラムは突然ファイルへの書き込みを開始できますか?これは何も追加しません。

あなただけのいずれかを記述するためのオープンなファイルを持っている旗をウンチすることはできません。開いているパスですべてのチェックをやり直す必要があります。

static int __init mainInit(void){ 

ほとんどの場合、カーネルはcamelCaseを使用しません。

int pid=13433; 

「=」の周囲に空白がありません。

struct task_struct * task; 

「*」と「タスク」の間の偽のスペース。

struct files_struct * files; 
    struct fdtable * filestable; 

iditomは 'fdt'という名前です。

struct path files_path; 

    //Get Task structure from PID 
    task = pid_task(find_vpid(pid), PIDTYPE_PID); 

rcuもtasklistも保持されていないため、これは安全ではありません。

//Get open FIles from the task tstructure 
    files = task->files; 

タスクロックが保持されていないため、デフリエンスが危険です。

デバッグを有効にしていた場合、カーネル自体が回線が間違っていると伝えます。

int i=0; 
    char *cwd; 
    char *buf = (char *)kmalloc(GFP_KERNEL,100*sizeof(char)); 

なぜキャストされているのですか?なぜ、100となぜsizeof(char)が含まれますか?ハードコーディングされた100は、エラーの起こりやすい繰り返しを招くので、間違っています。

while(filestable->fd[i] != NULL){ 

fdテーブルロックが保持されていないだけでなく、トラバーサルが安全でないため、希望通りに動作しません。プロセスは、使用されていないfdsを使用することができます。

 files_path = filestable->fd[i]->f_path; 
     cwd=d_path(&files_path,buf, 100*sizeof(char)); 

数値100のエラーが発生しやすくなりました。最初にここでd_pathするのが安全だと思いますか?

 printk(KERN_INFO "Open FD with %d with name %s with access %x\n", i, cwd,filestable->fd[i]->f_mode); 

     //printk(KERN_INFO "FMode read:%x Fmodewrite:%x\n",FMODE_READ,FMODE_WRITE); 


     //Check access mode 
     if(filestable->fd[i]->f_mode==FMODE_READ){ 
      printk(KERN_INFO "File has access FMODE_READ\n"); 
     }else if(filestable->fd[i]->f_mode==FMODE_WRITE){ 
      printk(KERN_INFO "File has access FMODE_WRTIE\n"); 
     } 
     i++; 
    } 
    return 0; 
} 

static void __exit mainExit(void){ 
    printk(KERN_INFO "Goodbye Kernel!. Returning to normal useless world!\n"); 
} 
関連する問題