diff options
author | Bragatheswaran Manickavel <bragathemanick0908@gmail.com> | 2023-11-18 14:40:12 +0530 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2023-11-23 22:27:34 +0100 |
commit | f91192cd68591c6b037da345bc9fcd5e50540358 (patch) | |
tree | 3aa61e39a57905367ff9aba8ba426953ac906245 /fs/btrfs | |
parent | 2db313205f8b96eea467691917138d646bb50aef (diff) | |
download | linux-stable-f91192cd68591c6b037da345bc9fcd5e50540358.tar.gz linux-stable-f91192cd68591c6b037da345bc9fcd5e50540358.tar.bz2 linux-stable-f91192cd68591c6b037da345bc9fcd5e50540358.zip |
btrfs: ref-verify: fix memory leaks in btrfs_ref_tree_mod()
In btrfs_ref_tree_mod(), when !parent 're' was allocated through
kmalloc(). In the following code, if an error occurs, the execution will
be redirected to 'out' or 'out_unlock' and the function will be exited.
However, on some of the paths, 're' are not deallocated and may lead to
memory leaks.
For example: lookup_block_entry() for 'be' returns NULL, the out label
will be invoked. During that flow ref and 'ra' are freed but not 're',
which can potentially lead to a memory leak.
CC: stable@vger.kernel.org # 5.10+
Reported-and-tested-by: syzbot+d66de4cbf532749df35f@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=d66de4cbf532749df35f
Signed-off-by: Bragatheswaran Manickavel <bragathemanick0908@gmail.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/ref-verify.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/ref-verify.c b/fs/btrfs/ref-verify.c index 1f62976bee82..6486f0d7e993 100644 --- a/fs/btrfs/ref-verify.c +++ b/fs/btrfs/ref-verify.c @@ -794,6 +794,7 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info, dump_ref_action(fs_info, ra); kfree(ref); kfree(ra); + kfree(re); goto out_unlock; } else if (be->num_refs == 0) { btrfs_err(fs_info, @@ -803,6 +804,7 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info, dump_ref_action(fs_info, ra); kfree(ref); kfree(ra); + kfree(re); goto out_unlock; } |