| From c5a7aacf7074f89e069f3d95988a92c1751f2955 Mon Sep 17 00:00:00 2001 |
| From: Filipe Manana <fdmanana@suse.com> |
| Date: Wed, 29 Jul 2020 10:17:50 +0100 |
| Subject: [PATCH] btrfs: fix memory leaks after failure to lookup checksums |
| during inode logging |
| |
| commit 4f26433e9b3eb7a55ed70d8f882ae9cd48ba448b upstream. |
| |
| While logging an inode, at copy_items(), if we fail to lookup the checksums |
| for an extent we release the destination path, free the ins_data array and |
| then return immediately. However a previous iteration of the for loop may |
| have added checksums to the ordered_sums list, in which case we leak the |
| memory used by them. |
| |
| So fix this by making sure we iterate the ordered_sums list and free all |
| its checksums before returning. |
| |
| Fixes: 3650860b90cc2a ("Btrfs: remove almost all of the BUG()'s from tree-log.c") |
| CC: stable@vger.kernel.org # 4.4+ |
| Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> |
| Signed-off-by: Filipe Manana <fdmanana@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
| index 40683b2b9707..e2e361d09959 100644 |
| --- a/fs/btrfs/tree-log.c |
| +++ b/fs/btrfs/tree-log.c |
| @@ -4049,11 +4049,8 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, |
| fs_info->csum_root, |
| ds + cs, ds + cs + cl - 1, |
| &ordered_sums, 0); |
| - if (ret) { |
| - btrfs_release_path(dst_path); |
| - kfree(ins_data); |
| - return ret; |
| - } |
| + if (ret) |
| + break; |
| } |
| } |
| } |
| @@ -4066,7 +4063,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, |
| * we have to do this after the loop above to avoid changing the |
| * log tree while trying to change the log tree. |
| */ |
| - ret = 0; |
| while (!list_empty(&ordered_sums)) { |
| struct btrfs_ordered_sum *sums = list_entry(ordered_sums.next, |
| struct btrfs_ordered_sum, |
| -- |
| 2.27.0 |
| |