Commit 22150a7d authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: Fix slab-use-after-free in qd_put



Commit a475c5dd ("gfs2: Free quota data objects synchronously")
started freeing quota data objects during filesystem shutdown instead of
putting them back onto the LRU list, but it failed to remove these
objects from the LRU list, causing LRU list corruption.  This caused
use-after-free when the shrinker (gfs2_qd_shrink_scan) tried to access
already-freed objects on the LRU list.

Fix this by removing qd objects from the LRU list before freeing them in
qd_put().

Initial fix from Deepanshu Kartikey <kartikey406@gmail.com>.

Fixes: a475c5dd ("gfs2: Free quota data objects synchronously")
Reported-by: default avatar <syzbot+046b605f01802054bff0@syzkaller.appspotmail.com>
Closes: https://syzkaller.appspot.com/bug?extid=046b605f01802054bff0


Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent 0ec49e7e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -334,6 +334,7 @@ static void qd_put(struct gfs2_quota_data *qd)
		lockref_mark_dead(&qd->qd_lockref);
		spin_unlock(&qd->qd_lockref.lock);

		list_lru_del_obj(&gfs2_qd_lru, &qd->qd_lru);
		gfs2_qd_dispose(qd);
		return;
	}