In the Linux kernel, the following vulnerability has been resolved:
nfsd: put dlstid if fail to queue dlrecall
Before calling nfsd4runcb to queue dlrecall to the callbackwq, we increment the reference count of dlstid. We expect that after the corresponding workstruct is processed, the reference count of dlstid will be decremented through the callback function nfsd4cbrecallrelease. However, if the call to nfsd4runcb fails, the incremented reference count of dlstid will not be decremented correspondingly, leading to the following nfs4stid leak: unreferenced object 0xffff88812067b578 (size 344): comm "nfsd", pid 2761, jiffies 4295044002 (age 5541.241s) hex dump (first 32 bytes): 01 00 00 00 6b 6b 6b 6b b8 02 c0 e2 81 88 ff ff ....kkkk........ 00 6b 6b 6b 6b 6b 6b 6b 00 00 00 00 ad 4e ad de .kkkkkkk.....N.. backtrace: kmemcachealloc+0x4b9/0x700 nfsd4processopen1+0x34/0x300 nfsd4open+0x2d1/0x9d0 nfsd4proccompound+0x7a2/0xe30 nfsddispatch+0x241/0x3e0 svcprocesscommon+0x5d3/0xcc0 svcprocess+0x2a3/0x320 nfsd+0x180/0x2e0 kthread+0x199/0x1d0 retfromfork+0x30/0x50 retfromforkasm+0x1b/0x30 unreferenced object 0xffff8881499f4d28 (size 368): comm "nfsd", pid 2761, jiffies 4295044005 (age 5541.239s) hex dump (first 32 bytes): 01 00 00 00 00 00 00 00 30 4d 9f 49 81 88 ff ff ........0M.I.... 30 4d 9f 49 81 88 ff ff 20 00 00 00 01 00 00 00 0M.I.... ....... backtrace: kmemcachealloc+0x4b9/0x700 nfs4allocstid+0x29/0x210 allocinitdeleg+0x92/0x2e0 nfs4setdelegation+0x284/0xc00 nfs4opendelegation+0x216/0x3f0 nfsd4processopen2+0x2b3/0xee0 nfsd4open+0x770/0x9d0 nfsd4proccompound+0x7a2/0xe30 nfsddispatch+0x241/0x3e0 svcprocesscommon+0x5d3/0xcc0 svcprocess+0x2a3/0x320 nfsd+0x180/0x2e0 kthread+0x199/0x1d0 retfromfork+0x30/0x50 retfromforkasm+0x1b/0x30 Fix it by checking the result of nfsd4runcb and call nfs4putstid if fail to queue dl_recall.