2012-04-03 5 views
1

カーネルモジュールをコンパイルするときに警告が表示されましたが、回避できません。copy_from_userサイズが確かに正しいとは限りませんか?

まず、この単純化されたコードを見てみましょう:私が得る

#define READ_CHUNK 100u 
static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data) 
{ 
    char command[READ_CHUNK]; 
    unsigned long left = count; 
    while (left > 0) 
    { 
     unsigned int amount = left<READ_CHUNK?left:READ_CHUNK;  
     if (copy_from_user(command, buf, amount)) 
      return -EFAULT; 
     buf += amount; 
     left -= amount; 
     /* process buffer */ 
    } 
    return count; 
} 

警告は次のようである:あなたが見ることができるように

warning: call to ‘copy_from_user_overflow’ declared with attribute warning: copy_from_user() buffer size is not provably correct

が、これは完全に間違っています。私が読んだデータのamountは確かに素晴らしいです!私が言ってminthis link gccを沈黙させる最後のパラメータで使用することができたが、それは私のために動作しませんでした(私は書いた:無駄に

if (copy_from_user(command, buf, min((unsigned long)amount, count))) 

)。

gccにはこれがクールだと知らせる方法を知っていますか?心配しないでください。

static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data) 
{ 
    char *read_buffer = vmalloc(count * sizeof(*read_buffer)); 
    if (read_buffer == NULL) 
     return -ENOMEM; 
    if (copy_from_user(read_buffer, buf, count)) 
    { 
     vfree(read_buffer); 
     return -EFAULT; 
    } 
    /* process buffer */ 
    vfree(read_buffer); 
    return count; 
} 

それは確かに正しい場合でも、私に同じ警告を与えるgccのもこの場合:


この問題が発生した別の場所には、以下のようなものです。


これは、正確なエラーです:

In file included from /usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess.h:571:0, 
       from <my source file>:7: 
/usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess_32.h: In function ‘copy_from_user’: 
/usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess_32.h:212:26: warning: call to ‘copy_from_user_overflow’ declared with attribute warning: copy_from_user() buffer size is not provably correct 

カーネルバージョン:2.6.35.9あなたの最初の例では(あなたが見ることができるように)RTAIと

+0

この警告がスローされるファイルも教えてください。あなたのカーネルのバージョンとそのような詳細は何ですか? –

+0

@PavanManjunath、私は今家にいますが、明日の朝に戻ってきます – Shahbaz

答えて

2

パッチを適用は、交換してみ

min((unsigned long)amount, count) 

min((unsigned long)READ_CHUNK, count) 

さて、サイズがコンパイル時自体で100のバイトを超え、したがって、我々はまた、100バイトである宛先バッファcommandを上書きすることはありませんgccのを説得しませんコピーすることを証明することができます。

第2の例では、read_buffercountもコンパイル時に認識されません。このエラーはあなたを取れしたくない場合は、mainlined Linuxカーネルを確認する場合は、あなたがする必要がcopy_from_user

コンパイル時評価可能なパラメータ(宛先バッファとサイズをコピー)を送信する、あなたはほとんど例がありませんユーザ空間データをカーネル内のmallocされたバッファに書き込んでいます。だから私はあなたのコードが完全に安全であることを持っている場合、あなたはバッファ

PSのmallocingを離れて行う必要があり、推測:gccは、いくつかのバッファオーバーフロー攻撃を防ぐことができます限られたbuffer overflow protectionメカニズムを実装する方法についての記事を読みます。

+0

'amount(読んでいない長い)READ_CHUNK、amount)'は、それでもメモリが動的に割り当てられ、したがって 'READ_CHUNK'のような固定サイズが存在しない2番目のケースでは、これは問題を解決しません! – Shahbaz

+0

ちなみに、私はあなたが言ったことを試しました(READ_CHUCKと金額は最小です)、私はまだ同じ警告を受け取ります – Shahbaz

+0

コピーサイズをハードコードすると警告が消えますか? 50(<100)のようなものを言う –

関連する問題