]> Git Repo - J-linux.git/commitdiff
btrfs: fix wrong address when faulting in pages in the search ioctl
authorFilipe Manana <[email protected]>
Mon, 14 Sep 2020 08:01:04 +0000 (09:01 +0100)
committerDavid Sterba <[email protected]>
Mon, 14 Sep 2020 15:27:16 +0000 (17:27 +0200)
When faulting in the pages for the user supplied buffer for the search
ioctl, we are passing only the base address of the buffer to the function
fault_in_pages_writeable(). This means that after the first iteration of
the while loop that searches for leaves, when we have a non-zero offset,
stored in 'sk_offset', we try to fault in a wrong page range.

So fix this by adding the offset in 'sk_offset' to the base address of the
user supplied buffer when calling fault_in_pages_writeable().

Several users have reported that the applications compsize and bees have
started to operate incorrectly since commit a48b73eca4ceb9 ("btrfs: fix
potential deadlock in the search ioctl") was added to stable trees, and
these applications make heavy use of the search ioctls. This fixes their
issues.

Link: https://lore.kernel.org/linux-btrfs/[email protected]/
Link: https://github.com/kilobyte/compsize/issues/34
Fixes: a48b73eca4ceb9 ("btrfs: fix potential deadlock in the search ioctl")
CC: [email protected] # 4.4+
Tested-by: A L <[email protected]>
Reviewed-by: Josef Bacik <[email protected]>
Signed-off-by: Filipe Manana <[email protected]>
Reviewed-by: David Sterba <[email protected]>
Signed-off-by: David Sterba <[email protected]>
fs/btrfs/ioctl.c

index ac45f022b495886a995c06f9722ec3d71152e436..2d9109d9e98f9dae41b29d2969cb9cc1345e26e5 100644 (file)
@@ -2193,7 +2193,8 @@ static noinline int search_ioctl(struct inode *inode,
        key.offset = sk->min_offset;
 
        while (1) {
-               ret = fault_in_pages_writeable(ubuf, *buf_size - sk_offset);
+               ret = fault_in_pages_writeable(ubuf + sk_offset,
+                                              *buf_size - sk_offset);
                if (ret)
                        break;
 
This page took 0.056294 seconds and 4 git commands to generate.