1

これは、nullドライバーのmyreadおよびmywrite関数です。

#define SIZE 6
    static char c[SIZE];

    static ssize_t myread(struct file *file,char __user *buf,size_t len, loff_t  *fops)
{
    printk(KERN_INFO"My read with length %zd \n",len);

    memset(buf,0,SIZE);
    //return is status i.e., 0.
    if(copy_to_user(buf,c,SIZE) != 0)
        return -EFAULT;
    else if (*fops > 0)
        return 0;
        else
            *fops += SIZE;
            return SIZE;
}


static ssize_t mywrite(struct file *file, const char __user *buf, size_t len, loff_t *fops)
    {
        printk(KERN_INFO "My write \n");
        memset(c,0,SIZE);
            if (len <= SIZE)`
            {`
        if(copy_from_user(c,buf,len) != 0)
            return -EFAULT;
        else
            //number of bytes written to the kernel space is returned
            return len;`
            }
            else 
                    return -EFAULT;`
    }

モジュールをビルドすると、次のような警告がスローされます。

/usr/src/linux-headers-3.2.0-36-generic-pae/arch/x86/include/asm/uaccess_32.h:関数'mywrite':/usr/src/linux-headers-3.2.0- 36-generic-pae / arch / x86 / include / asm / uaccess_32.h:211:26:警告:属性warningで宣言された'copy_from_user_overflow'の呼び出し:copy_from_user()バッファーサイズが正しくないことが証明されています[デフォルトで有効]

この警告を取り除く方法のように私を導いてください。私はどこで間違いをしているのか。

4

1 に答える 1

2

あなたの問題は、あなたと関数lenに渡されるものが;より大きいかもしれないということです。この場合、/は配列をオーバーフローさせ、他の近くのメモリからの読み取り/書き込みを行います。コードは、コピーの長さを、アクセスしているカーネルメモリの長さ以下に制限する必要があります。myreadmywriteSIZEcopy_from_usercopy_to_user

于 2013-01-30T19:00:46.753 に答える