On Mon, 2025-01-13 at 10:59 +0800, Li Lingfeng wrote: > In nfsd_file_put, after inserting the nfsd_file into the nfsd_file_lru > list, gc may be triggered in another thread and immediately release this > nfsd_file, which will lead to a UAF when accessing this nfsd_file again. > > All the places where unhash is done will also perform lru_remove, so there > is no need to do lru_remove separately here. After inserting the nfsd_file > into the nfsd_file_lru list, it can be released by relying on gc. > > Fixes: 4a0e73e635e3 ("NFSD: Leave open files out of the filecache LRU") > Signed-off-by: Li Lingfeng <lilingfeng3@xxxxxxxxxx> > --- > fs/nfsd/filecache.c | 12 ++---------- > 1 file changed, 2 insertions(+), 10 deletions(-) > > diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c > index a1cdba42c4fa..37b65cb1579a 100644 > --- a/fs/nfsd/filecache.c > +++ b/fs/nfsd/filecache.c > @@ -372,18 +372,10 @@ nfsd_file_put(struct nfsd_file *nf) > /* Try to add it to the LRU. If that fails, decrement. */ > if (nfsd_file_lru_add(nf)) { > /* If it's still hashed, we're done */ > - if (test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { > + if (list_lru_count(&nfsd_file_lru)) > nfsd_file_schedule_laundrette(); > - return; > - } > > - /* > - * We're racing with unhashing, so try to remove it from > - * the LRU. If removal fails, then someone else already > - * has our reference. > - */ > - if (!nfsd_file_lru_remove(nf)) > - return; > + return; > } > } > if (refcount_dec_and_test(&nf->nf_ref)) I think this looks OK. Filecache bugs are particularly nasty though, so let's run this through a nice long testing cycle. Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>