Patch "NFSD: Fix a null reference case in find_or_create_lock_stateid()" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
NFSD: Fix a null reference case in find_or_create_lock_stateid()
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nfsd-fix-a-null-reference-case-in-find_or_create_lock_stateid.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
d19fb70dd68c4e960e2ac09b0b9c79dfdeefa726Mon Sep 17 00:00:00 2001
From: Kinglong Mee <[email protected]>
Date: Wed, 18 Jan 2017 19:04:42 +0800
Subject: NFSD: Fix a null reference case in find_or_create_lock_stateid()
From: Kinglong Mee <[email protected]>
commit d19fb70dd68c4e960e2ac09b0b9c79dfdeefa726 upstream.
nfsd assigns the nfs4_free_lock_stateid to .sc_free in init_lock_stateid().
If nfsd doesn't go through init_lock_stateid() and put stateid at end, there is a NULL reference to .sc_free when calling nfs4_put_stid(ns).
This patch let the nfs4_stid.sc_free assignment to nfs4_alloc_stid().
--- fs/nfsd/nfs4layouts.c | 5 +++-- fs/nfsd/nfs4state.c | 19 ++++++++----------- fs/nfsd/state.h | 4 ++-- 3 files changed, 13 insertions(+), 15 deletions(-)
fs/nfsd/nfs4layouts.c +3 -2
@@ -223,10 +223,11 @@ nfsd4_alloc_layout_stateid(struct nfsd4_struct nfs4_layout_stateid *ls;struct nfs4_stid *stp; - stp =nfs4_alloc_stid (cstate->clp, nfs4_layout_stateid_cache); + stp =nfs4_alloc_stid (cstate->clp, nfs4_layout_stateid_cache, + nfsd4_free_layout_stateid);if (!stp)return NULL ; - stp->sc_free = nfsd4_free_layout_stateid; +get_nfs4_file (fp); stp->sc_file = fp;
fs/nfsd/nfs4state.c +8 -11
@@ -633,8 +633,8 @@ out:return co; } -struct nfs4_stid *nfs4_alloc_stid (struct nfs4_client *cl, -struct kmem_cache *slab) +struct nfs4_stid *nfs4_alloc_stid (struct nfs4_client *cl,struct kmem_cache *slab, +void (*sc_free)(struct nfs4_stid *)) {struct nfs4_stid *stid;int new_id;
@@ -650,6 +650,8 @@ struct nfs4_stid *nfs4_alloc_stid(structidr_preload_end ();if (new_id <0 ) goto out_free; + + stid->sc_free = sc_free; stid->sc_client = cl; stid->sc_stateid.si_opaque.so_id = new_id; stid->sc_stateid.si_opaque.so_clid = cl->cl_clientid;
@@ -675,15 +677,12 @@ out_free:static struct nfs4_ol_stateid *nfs4_alloc_open_stateid (struct nfs4_client *clp) {struct nfs4_stid *stid; -struct nfs4_ol_stateid *stp; - stid =nfs4_alloc_stid (clp, stateid_slab); + stid =nfs4_alloc_stid (clp, stateid_slab, nfs4_free_ol_stateid);if (!stid)return NULL ; - stp =openlockstateid (stid); - stp->st_stid.sc_free = nfs4_free_ol_stateid; -return stp; +return openlockstateid (stid); }static void nfs4_free_deleg (struct nfs4_stid *stid)
@@ -781,11 +780,10 @@ alloc_init_deleg(struct nfs4_client *clp goto out_dec;if (delegation_blocked (¤t_fh->fh_handle)) goto out_dec; - dp =delegstateid (nfs4_alloc_stid (clp, deleg_slab)); + dp =delegstateid (nfs4_alloc_stid (clp, deleg_slab, nfs4_free_deleg));if (dp ==NULL ) goto out_dec; - dp->dl_stid.sc_free = nfs4_free_deleg;/* * delegation seqid's are never incremented. The 4.1 special * meaning of seqid 0 isn't meaningful, really, but let's avoid
@@ -5580,7 +5578,6 @@ init_lock_stateid(struct nfs4_ol_stateid stp->st_stateowner =nfs4_get_stateowner (&lo->lo_owner);get_nfs4_file (fp); stp->st_stid.sc_file = fp; - stp->st_stid.sc_free = nfs4_free_lock_stateid; stp->st_access_bmap =0 ; stp->st_deny_bmap = open_stp->st_deny_bmap; stp->st_openstp = open_stp;
@@ -5623,7 +5620,7 @@ find_or_create_lock_stateid(struct nfs4_ lst =find_lock_stateid (lo, fi);if (lst ==NULL ) {spin_unlock (&clp->cl_lock); - ns =nfs4_alloc_stid (clp, stateid_slab); + ns =nfs4_alloc_stid (clp, stateid_slab, nfs4_free_lock_stateid);if (ns ==NULL )return NULL ;
fs/nfsd/state.h +2 -2
@@ -603,8 +603,8 @@ extern __be32 nfs4_preprocess_stateid_op__be32 nfsd4_lookup_stateid (struct nfsd4_compound_state *cstate,stateid_t *stateid,unsigned char typemask,struct nfs4_stid **s,struct nfsd_net *nn); -struct nfs4_stid *nfs4_alloc_stid (struct nfs4_client *cl, -struct kmem_cache *slab); +struct nfs4_stid *nfs4_alloc_stid (struct nfs4_client *cl,struct kmem_cache *slab, +void (*sc_free)(struct nfs4_stid *));void nfs4_unhash_stid (struct nfs4_stid *s);void nfs4_put_stid (struct nfs4_stid *s);void nfs4_inc_and_copy_stateid (stateid_t *dst,struct nfs4_stid *stid);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/nfsd-fix-a-null-reference-case-in-find_or_create_lock_stateid.patch