On Thu, Aug 03, 2023 at 10:17:13AM +0100, Luís Henriques wrote: > If the filename casefolding fails, we'll be leaking memory from the > fscrypt_name struct, namely from the 'crypto_buf.name' member. > > Make sure we free it in the error path on both ext4_fname_setup_filename() > and ext4_fname_prepare_lookup() functions. > > Fixes: 1ae98e295fa2 ("ext4: optimize match for casefolded encrypted dirs") > Signed-off-by: Luís Henriques <lhenriques@xxxxxxx> > --- > Changes since v2: > - Rephrased commit log to (hopefully!) make it more clear. > - Use ext4_fname_free_filename() instead of fscrypt_free_filename(). > Although not strictly needed, it cleans up the fname struct, removing a > dangling pointer to freed memory. > > Changes since v1: > - Include fix to ext4_fname_prepare_lookup() as well > - Add 'Fixes:' tag > > fs/ext4/crypto.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c > index e20ac0654b3f..453d4da5de52 100644 > --- a/fs/ext4/crypto.c > +++ b/fs/ext4/crypto.c > @@ -33,6 +33,8 @@ int ext4_fname_setup_filename(struct inode *dir, const struct qstr *iname, > > #if IS_ENABLED(CONFIG_UNICODE) > err = ext4_fname_setup_ci_filename(dir, iname, fname); > + if (err) > + ext4_fname_free_filename(fname); > #endif > return err; > } > @@ -51,6 +53,8 @@ int ext4_fname_prepare_lookup(struct inode *dir, struct dentry *dentry, > > #if IS_ENABLED(CONFIG_UNICODE) > err = ext4_fname_setup_ci_filename(dir, &dentry->d_name, fname); > + if (err) > + ext4_fname_free_filename(fname); > #endif > return err; > } Reviewed-by: Eric Biggers <ebiggers@xxxxxxxxxx> - Eric