]> git.itanic.dy.fi Git - linux-stable/commitdiff
NFSD: unregister shrinker when nfsd_init_net() fails
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Mon, 10 Oct 2022 05:59:02 +0000 (14:59 +0900)
committerChuck Lever <chuck.lever@oracle.com>
Tue, 11 Oct 2022 14:08:26 +0000 (10:08 -0400)
syzbot is reporting UAF read at register_shrinker_prepared() [1], for
commit 7746b32f467b3813 ("NFSD: add shrinker to reap courtesy clients on
low memory condition") missed that nfsd4_leases_net_shutdown() from
nfsd_exit_net() is called only when nfsd_init_net() succeeded.
If nfsd_init_net() fails due to nfsd_reply_cache_init() failure,
register_shrinker() from nfsd4_init_leases_net() has to be undone
before nfsd_init_net() returns.

Link: https://syzkaller.appspot.com/bug?extid=ff796f04613b4c84ad89
Reported-by: syzbot <syzbot+ff796f04613b4c84ad89@syzkaller.appspotmail.com>
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Fixes: 7746b32f467b3813 ("NFSD: add shrinker to reap courtesy clients on low memory condition")
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsctl.c

index 6a29bcfc93909dea11846dfd19bbb86fdb939dd1..dc74a947a440cba3d217eb74befbaeec36e1c1cc 100644 (file)
@@ -1458,12 +1458,14 @@ static __net_init int nfsd_init_net(struct net *net)
                goto out_drc_error;
        retval = nfsd_reply_cache_init(nn);
        if (retval)
-               goto out_drc_error;
+               goto out_cache_error;
        get_random_bytes(&nn->siphash_key, sizeof(nn->siphash_key));
        seqlock_init(&nn->writeverf_lock);
 
        return 0;
 
+out_cache_error:
+       nfsd4_leases_net_shutdown(nn);
 out_drc_error:
        nfsd_idmap_shutdown(net);
 out_idmap_error: