]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gfs2: Don't clear sb->s_fs_info in gfs2_sys_fs_add
authorAndrew Price <anprice@redhat.com>
Wed, 28 May 2025 15:02:37 +0000 (16:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jun 2025 13:41:08 +0000 (15:41 +0200)
commit 9126d2754c5e5d1818765811a10af0a14cf1fa0a upstream.

When gfs2_sys_fs_add() fails, it sets sb->s_fs_info to NULL on its error
path (see commit 0d515210b696 ("GFS2: Add kobject release method")).
The intention seems to be to prevent dereferencing sb->s_fs_info once
the object pointed to has been deallocated, but that would be better
achieved by setting the pointer to NULL in free_sbd().

As a consequence, when the call to gfs2_sys_fs_add() fails in
gfs2_fill_super(), sdp = GFS2_SB(inode) will evaluate to NULL in iput()
-> gfs2_drop_inode(), and accessing sdp->sd_flags will be a NULL pointer
dereference.

Fix that by only setting sb->s_fs_info to NULL when actually freeing the
object pointed to in free_sbd().

Fixes: ae9f3bd8259a ("gfs2: replace sd_aspace with sd_inode")
Reported-by: syzbot+b12826218502df019f9d@syzkaller.appspotmail.com
Signed-off-by: Andrew Price <anprice@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/gfs2/ops_fstype.c
fs/gfs2/sys.c

index 6ce475e1c6d64cc154777a43d8788fb286dc3b67..4a0f7de41b2b2f452951a289744fc2083702f682 100644 (file)
@@ -64,8 +64,11 @@ static void gfs2_tune_init(struct gfs2_tune *gt)
 
 void free_sbd(struct gfs2_sbd *sdp)
 {
+       struct super_block *sb = sdp->sd_vfs;
+
        if (sdp->sd_lkstats)
                free_percpu(sdp->sd_lkstats);
+       sb->s_fs_info = NULL;
        kfree(sdp);
 }
 
@@ -1316,7 +1319,6 @@ fail_iput:
        iput(sdp->sd_inode);
 fail_free:
        free_sbd(sdp);
-       sb->s_fs_info = NULL;
        return error;
 }
 
index ecc699f8d9fcaa01f7514a465d7d9f42ac8d659c..6286183021022a7621fb4927d712a61decded98c 100644 (file)
@@ -764,7 +764,6 @@ fail_reg:
        fs_err(sdp, "error %d adding sysfs files\n", error);
        kobject_put(&sdp->sd_kobj);
        wait_for_completion(&sdp->sd_kobj_unregister);
-       sb->s_fs_info = NULL;
        return error;
 }