nfs: fix potential credential leak in ff_layout_update_mirror_cred

If we have two tasks racing to update a mirror's credentials, then they
can end up leaking one (or more) sets of credentials. The first task
will set mirror->cred and then the second task will just overwrite it.

Use a cmpxchg to ensure that the creds are only set once. If we get to
the point where we would set mirror->cred and find that they're already
set, then we just release the creds that were just found.

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Cc: stable@vger.kernel.org # 4.0+
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Jeff Layton 2015-06-24 12:10:23 -04:00 committed by Trond Myklebust
parent 1372a3130a
commit a24221dca1

View File

@ -324,7 +324,8 @@ static int ff_layout_update_mirror_cred(struct nfs4_ff_layout_mirror *mirror,
__func__, PTR_ERR(cred)); __func__, PTR_ERR(cred));
return PTR_ERR(cred); return PTR_ERR(cred);
} else { } else {
mirror->cred = cred; if (cmpxchg(&mirror->cred, NULL, cred))
put_rpccred(cred);
} }
} }
return 0; return 0;