カーネルモジュールをコンパイルするときに警告が表示されましたが、回避できません。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
は確かに素晴らしいです!私が言ってmin
this 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と
この警告がスローされるファイルも教えてください。あなたのカーネルのバージョンとそのような詳細は何ですか? –
@PavanManjunath、私は今家にいますが、明日の朝に戻ってきます – Shahbaz