firmware: use 'kernel_read()' to read firmware into kernel buffer
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Oct 2012 16:19:02 +0000 (09:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Oct 2012 16:19:02 +0000 (09:19 -0700)
Fengguang correctly points out that the firmware reading should not use
vfs_read(), since the buffer is in kernel space.

The vfs_read() just happened to work for kernel threads, but sparse
warns about the incorrect address spaces, and it's definitely incorrect
and could fail for other users of the firmware loading.

Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/base/firmware_class.c

index e85763de928f096e46cbfd74abb69c064e5c2101..81541452887bd3ce5d868909e3fb753fb3d6b124 100644 (file)
@@ -58,7 +58,6 @@ static noinline long fw_file_size(struct file *file)
 
 static bool fw_read_file_contents(struct file *file, struct firmware *fw)
 {
-       loff_t pos;
        long size;
        char *buf;
 
@@ -68,8 +67,7 @@ static bool fw_read_file_contents(struct file *file, struct firmware *fw)
        buf = vmalloc(size);
        if (!buf)
                return false;
-       pos = 0;
-       if (vfs_read(file, buf, size, &pos) != size) {
+       if (kernel_read(file, 0, buf, size) != size) {
                vfree(buf);
                return false;
        }