Commit c88c150a authored by Olga Kornievskaia's avatar Olga Kornievskaia Committed by Chuck Lever
Browse files

nfsd: fix possible badness in FREE_STATEID



When multiple FREE_STATEIDs are sent for the same delegation stateid,
it can lead to a possible either use-after-free or counter refcount
underflow errors.

In nfsd4_free_stateid() under the client lock we find a delegation
stateid, however the code drops the lock before calling nfs4_put_stid(),
that allows another FREE_STATE to find the stateid again. The first one
will proceed to then free the stateid which leads to either
use-after-free or decrementing already zeroed counter.

Fixes: 3f29cc82 ("nfsd: split sc_status out of sc_type")
Signed-off-by: default avatarOlga Kornievskaia <okorniev@redhat.com>
Reviewed-by: default avatarBenjamin Coddington <bcodding@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 53e4e175
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7154,6 +7154,7 @@ nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	switch (s->sc_type) {
	case SC_TYPE_DELEG:
		if (s->sc_status & SC_STATUS_REVOKED) {
			s->sc_status |= SC_STATUS_CLOSED;
			spin_unlock(&s->sc_lock);
			dp = delegstateid(s);
			list_del_init(&dp->dl_recall_lru);