diff options
author | Lu Fengqi <lufq.fnst@cn.fujitsu.com> | 2018-06-19 02:54:38 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-06-21 13:21:13 -0400 |
commit | 22883ddc66df402f2fbc37fe1f4d2779238e4b2d (patch) | |
tree | d0f75b3ecc879da62260f4c7d6b3aa1372595156 | |
parent | f098631848cd9f4142b6dec7ea95baad846e1670 (diff) |
btrfs: fix invalid-free in btrfs_extent_same
If this condition ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) !=
(BTRFS_I(dst)->flags & BTRFS_INODE_NODATASUM))
is hit, we will go to free the uninitialized cmp.src_pages and
cmp.dst_pages.
Fixes: 67b07bd4bec5 ("Btrfs: reuse cmp workspace in EXTENT_SAME ioctl")
Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | fs/btrfs/ioctl.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 5556e9ea2a4b..a4d2856a4df1 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -3577,7 +3577,7 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen, | |||
3577 | ret = btrfs_extent_same_range(src, loff, BTRFS_MAX_DEDUPE_LEN, | 3577 | ret = btrfs_extent_same_range(src, loff, BTRFS_MAX_DEDUPE_LEN, |
3578 | dst, dst_loff, &cmp); | 3578 | dst, dst_loff, &cmp); |
3579 | if (ret) | 3579 | if (ret) |
3580 | goto out_unlock; | 3580 | goto out_free; |
3581 | 3581 | ||
3582 | loff += BTRFS_MAX_DEDUPE_LEN; | 3582 | loff += BTRFS_MAX_DEDUPE_LEN; |
3583 | dst_loff += BTRFS_MAX_DEDUPE_LEN; | 3583 | dst_loff += BTRFS_MAX_DEDUPE_LEN; |
@@ -3587,16 +3587,16 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen, | |||
3587 | ret = btrfs_extent_same_range(src, loff, tail_len, dst, | 3587 | ret = btrfs_extent_same_range(src, loff, tail_len, dst, |
3588 | dst_loff, &cmp); | 3588 | dst_loff, &cmp); |
3589 | 3589 | ||
3590 | out_free: | ||
3591 | kvfree(cmp.src_pages); | ||
3592 | kvfree(cmp.dst_pages); | ||
3593 | |||
3590 | out_unlock: | 3594 | out_unlock: |
3591 | if (same_inode) | 3595 | if (same_inode) |
3592 | inode_unlock(src); | 3596 | inode_unlock(src); |
3593 | else | 3597 | else |
3594 | btrfs_double_inode_unlock(src, dst); | 3598 | btrfs_double_inode_unlock(src, dst); |
3595 | 3599 | ||
3596 | out_free: | ||
3597 | kvfree(cmp.src_pages); | ||
3598 | kvfree(cmp.dst_pages); | ||
3599 | |||
3600 | return ret; | 3600 | return ret; |
3601 | } | 3601 | } |
3602 | 3602 | ||