Message ID | c76a4f058227e32861e0afe1e1851137304a2169.1671534537.git.fdmanana@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: fix fscrypt name leak after failure to join log transaction | expand |
On 12/20/22 06:13, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > 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") > Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me> I keep reexamining that change and still keep failing at finding missing frees until they're pointed out, so particular thanks.
On Tue, Dec 20, 2022 at 11:13:33AM +0000, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > 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") > Signed-off-by: Filipe Manana <fdmanana@suse.com> Added to misc-next, thanks.
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index a3c43f0b1c95..fb52aa060093 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -7459,8 +7459,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();