aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLu Fengqi <lufq.fnst@cn.fujitsu.com>2018-06-19 02:54:38 -0400
committerDavid Sterba <dsterba@suse.com>2018-06-21 13:21:13 -0400
commit22883ddc66df402f2fbc37fe1f4d2779238e4b2d (patch)
treed0f75b3ecc879da62260f4c7d6b3aa1372595156
parentf098631848cd9f4142b6dec7ea95baad846e1670 (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.c10
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
3590out_free:
3591 kvfree(cmp.src_pages);
3592 kvfree(cmp.dst_pages);
3593
3590out_unlock: 3594out_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
3596out_free:
3597 kvfree(cmp.src_pages);
3598 kvfree(cmp.dst_pages);
3599
3600 return ret; 3600 return ret;
3601} 3601}
3602 3602