]> git.hungrycats.org Git - linux/commitdiff
[PATCH] kNFSd: check lock length, return appropriate error
authorAndrew Morton <akpm@osdl.org>
Thu, 26 Feb 2004 14:48:37 +0000 (06:48 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 26 Feb 2004 14:48:37 +0000 (06:48 -0800)
From: NeilBrown <neilb@cse.unsw.edu.au>

check lock length, return appropriate error

fs/nfsd/nfs4state.c

index f92464da97b1cffdf594ab4d33b5b48630b701a2..6f0d14b6b98a531a0898ab44dd7b7442f01281cb 100644 (file)
@@ -1784,6 +1784,13 @@ out:
        return stp;
 }
 
+int
+check_lock_length(u64 offset, u64 length)
+{
+       return ((length == 0)  || ((length != ~(u64)0) &&
+            LOFF_OVERFLOW(offset, length)));
+}
+
 /*
  *  LOCK operation 
  */
@@ -1802,6 +1809,9 @@ nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
                (long long) lock->lk_offset,
                (long long) lock->lk_length);
 
+       if (check_lock_length(lock->lk_offset, lock->lk_length))
+                return nfserr_inval;
+
        lock->lk_stateowner = NULL;
        nfs4_lock_state();
 
@@ -1963,6 +1973,9 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
        unsigned int strhashval;
        int status;
 
+       if (check_lock_length(lockt->lt_offset, lockt->lt_length))
+                return nfserr_inval;
+
        lockt->lt_stateowner = NULL;
        nfs4_lock_state();
 
@@ -2049,6 +2062,10 @@ nfsd4_locku(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
        dprintk("NFSD: nfsd4_locku: start=%Ld length=%Ld\n",
                (long long) locku->lu_offset,
                (long long) locku->lu_length);
+
+       if (check_lock_length(locku->lu_offset, locku->lu_length))
+                return nfserr_inval;
+
        nfs4_lock_state();
                                                                                
        if ((status = nfs4_preprocess_seqid_op(current_fh,