Message ID | 20220531030117.403302-1-lsahlber@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cifs: fix potential double free during failed mount | expand |
added cc:stable and merged into cifs-2.6.git for-next On Mon, May 30, 2022 at 10:01 PM Ronnie Sahlberg <lsahlber@redhat.com> wrote: > > RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=2088799 > > Signed-off-by: Roberto Bergantinos <rbergant@redhat.com> > Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com> > --- > fs/cifs/cifsfs.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index f539a39d47f5..12c872800326 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -838,7 +838,7 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, > int flags, struct smb3_fs_context *old_ctx) > { > int rc; > - struct super_block *sb; > + struct super_block *sb = NULL; > struct cifs_sb_info *cifs_sb = NULL; > struct cifs_mnt_data mnt_data; > struct dentry *root; > @@ -934,9 +934,11 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, > return root; > out: > if (cifs_sb) { > - kfree(cifs_sb->prepath); > - smb3_cleanup_fs_context(cifs_sb->ctx); > - kfree(cifs_sb); > + if (!sb || IS_ERR(sb)) { /* otherwise kill_sb will handle */ > + kfree(cifs_sb->prepath); > + smb3_cleanup_fs_context(cifs_sb->ctx); > + kfree(cifs_sb); > + } > } > return root; > } > -- > 2.35.3 >
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index f539a39d47f5..12c872800326 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -838,7 +838,7 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, int flags, struct smb3_fs_context *old_ctx) { int rc; - struct super_block *sb; + struct super_block *sb = NULL; struct cifs_sb_info *cifs_sb = NULL; struct cifs_mnt_data mnt_data; struct dentry *root; @@ -934,9 +934,11 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, return root; out: if (cifs_sb) { - kfree(cifs_sb->prepath); - smb3_cleanup_fs_context(cifs_sb->ctx); - kfree(cifs_sb); + if (!sb || IS_ERR(sb)) { /* otherwise kill_sb will handle */ + kfree(cifs_sb->prepath); + smb3_cleanup_fs_context(cifs_sb->ctx); + kfree(cifs_sb); + } } return root; }