]> err.no Git - linux-2.6/commitdiff
[CIFS] Byte range unlock request to non-Unix server can unlock too much
authorJeff Layton <jlayton@redhat.com>
Fri, 24 Aug 2007 03:16:51 +0000 (03:16 +0000)
committerSteve French <sfrench@us.ibm.com>
Fri, 24 Aug 2007 03:16:51 +0000 (03:16 +0000)
On a mount without posix extensions enabled, when an unlock request is
made, the client can release more than is intended. To reproduce, on a
CIFS mount without posix extensions enabled:

1) open file
2) do fcntl lock: start=0 len=1
3) do fcntl lock: start=2 len=1
4) do fcntl unlock: start=0 len=1

...on the unlock call the client sends an unlock request to the server
for both locks. The problem is a bad test in cifs_lock.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/CHANGES
fs/cifs/file.c

index bed6215c0794ef8d9264b113aff767dc85ef4025..41e3b6a9397ceecd1bf56f409165ea27242da553 100644 (file)
@@ -6,7 +6,10 @@ done with "serverino" mount option).  Add support for POSIX Unlink
 Samba supports newer POSIX CIFS Protocol Extensions). Add "nounix"
 mount option to allow disabling the CIFS Unix Extensions for just
 that mount. Fix hang on spinlock in find_writable_file (race when
-reopening file after session crash).
+reopening file after session crash).  Byte range unlock request to
+windows server could unlock more bytes (on server copy of file)
+than intended if start of unlock request is well before start of
+a previous byte range lock that we issued.
 
 Version 1.49
 ------------
index 894b1f7b299d5d5dc679b391bb54ca6e1abc092e..f9bd8b83f40e99d518cb47a8184f5c520e4a674d 100644 (file)
@@ -767,7 +767,8 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
                        mutex_lock(&fid->lock_mutex);
                        list_for_each_entry_safe(li, tmp, &fid->llist, llist) {
                                if (pfLock->fl_start <= li->offset &&
-                                               length >= li->length) {
+                                               (pflock->fl_start + length) >=
+                                               (li->offset + li->length)) {
                                        stored_rc = CIFSSMBLock(xid, pTcon,
                                                        netfid,
                                                        li->length, li->offset,