]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
NFSv4: Check for NULL argument in nfs_*_seqid() functions
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 24 Jan 2015 00:04:44 +0000 (19:04 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 24 Jan 2015 04:06:45 +0000 (23:06 -0500)
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4state.c
fs/nfs/nfs4xdr.c

index b922e43d69b88b462c70192999cfe8243c9e3d77..590f096fd01179a039015d3d8f7efc5ad4055f30 100644 (file)
@@ -1015,7 +1015,7 @@ void nfs_release_seqid(struct nfs_seqid *seqid)
 {
        struct nfs_seqid_counter *sequence;
 
-       if (list_empty(&seqid->list))
+       if (seqid == NULL || list_empty(&seqid->list))
                return;
        sequence = seqid->sequence;
        spin_lock(&sequence->lock);
@@ -1071,13 +1071,15 @@ static void nfs_increment_seqid(int status, struct nfs_seqid *seqid)
 
 void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
 {
-       struct nfs4_state_owner *sp = container_of(seqid->sequence,
-                                       struct nfs4_state_owner, so_seqid);
-       struct nfs_server *server = sp->so_server;
+       struct nfs4_state_owner *sp;
+
+       if (seqid == NULL)
+               return;
 
+       sp = container_of(seqid->sequence, struct nfs4_state_owner, so_seqid);
        if (status == -NFS4ERR_BAD_SEQID)
                nfs4_drop_state_owner(sp);
-       if (!nfs4_has_session(server->nfs_client))
+       if (!nfs4_has_session(sp->so_server->nfs_client))
                nfs_increment_seqid(status, seqid);
 }
 
@@ -1088,14 +1090,18 @@ void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
  */
 void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid)
 {
-       nfs_increment_seqid(status, seqid);
+       if (seqid != NULL)
+               nfs_increment_seqid(status, seqid);
 }
 
 int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
 {
-       struct nfs_seqid_counter *sequence = seqid->sequence;
+       struct nfs_seqid_counter *sequence;
        int status = 0;
 
+       if (seqid == NULL)
+               goto out;
+       sequence = seqid->sequence;
        spin_lock(&sequence->lock);
        seqid->task = task;
        if (list_empty(&seqid->list))
@@ -1106,6 +1112,7 @@ int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
        status = -EAGAIN;
 unlock:
        spin_unlock(&sequence->lock);
+out:
        return status;
 }
 
index 7e7be5ab70bb6892bcbdf49930ebdb4d5260c304..d05fada4929ced21e15358738a49671fe2451122 100644 (file)
@@ -946,7 +946,10 @@ static void encode_uint64(struct xdr_stream *xdr, u64 n)
 static void encode_nfs4_seqid(struct xdr_stream *xdr,
                const struct nfs_seqid *seqid)
 {
-       encode_uint32(xdr, seqid->sequence->counter);
+       if (seqid != NULL)
+               encode_uint32(xdr, seqid->sequence->counter);
+       else
+               encode_uint32(xdr, 0);
 }
 
 static void encode_compound_hdr(struct xdr_stream *xdr,