splice: fix user pointer access in get_iovec_page_array()
authorBastian Blank <bastian@waldi.eu.org>
Sun, 10 Feb 2008 14:47:57 +0000 (16:47 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 11 Feb 2008 06:02:37 +0000 (22:02 -0800)
patch 712a30e63c8066ed84385b12edbfb804f49cbc44 in mainline.

Commit 8811930dc74a503415b35c4a79d14fb0b408a361 ("splice: missing user
pointer access verification") added the proper access_ok() calls to
copy_from_user_mmap_sem() which ensures we can copy the struct iovecs
from userspace to the kernel.

But we also must check whether we can access the actual memory region
pointed to by the struct iovec to fix the access checks properly.

Signed-off-by: Bastian Blank <waldi@debian.org>
Acked-by: Oliver Pinter <oliver.pntr@gmail.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/splice.c

index 2aa8f5ab1c49d5ca42ae1ec2ae7b04d6f0b2d0e1..1a9c0e657f2f8a6eecef86f8817eeac678c22109 100644 (file)
@@ -1289,7 +1289,7 @@ static int get_iovec_page_array(const struct iovec __user *iov,
                if (unlikely(!len))
                        break;
                error = -EFAULT;
-               if (unlikely(!base))
+               if (!access_ok(VERIFY_READ, base, len))
                        break;
 
                /*