]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: fix fscrypt name leak after failure to join log transaction
authorFilipe Manana <fdmanana@suse.com>
Tue, 20 Dec 2022 11:13:33 +0000 (11:13 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Oct 2023 20:00:46 +0000 (22:00 +0200)
commit fee4c19937439693f2420a916169d08e88576e8e upstream.

When logging a new name, we don't expect to fail joining a log transaction
since we know at least one of the inodes was logged before in the current
transaction. However if we fail for some unexpected reason, we end up not
freeing the fscrypt name we previously allocated. So fix that by freeing
the name in case we failed to join a log transaction.

Fixes: ab3c5c18e8fa ("btrfs: setup qstr from dentrys using fscrypt helper")
Reviewed-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/tree-log.c

index ab7893debf07a0422821d734ef066ab4cca0b56f..c03ff6a5a7f6b20196c6e969bfc75c999a9d6512 100644 (file)
@@ -7491,8 +7491,11 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
                 * not fail, but if it does, it's not serious, just bail out and
                 * mark the log for a full commit.
                 */
-               if (WARN_ON_ONCE(ret < 0))
+               if (WARN_ON_ONCE(ret < 0)) {
+                       fscrypt_free_filename(&fname);
                        goto out;
+               }
+
                log_pinned = true;
 
                path = btrfs_alloc_path();