s4-ntvfs: move valid lock range test from smb2 layer to generic code
authorAndrew Tridgell <tridge@samba.org>
Fri, 27 Nov 2009 07:08:51 +0000 (18:08 +1100)
committerAndrew Tridgell <tridge@samba.org>
Fri, 27 Nov 2009 08:42:10 +0000 (19:42 +1100)
win7 also fails invalid lock ranges on SMB

source4/ntvfs/common/brlock_tdb.c
source4/ntvfs/ntvfs_generic.c

index 299400b96c40fa6917a15407e0aa722be469f2c7..df95d4c4c6e4c71bd3eed3253c5ba7f669954604 100644 (file)
@@ -80,6 +80,13 @@ struct brl_handle {
        struct lock_struct last_lock;
 };
 
+/* see if we have wrapped locks, which are no longer allowed (windows
+ * changed this in win7 */
+static bool brl_invalid_lock_range(uint64_t start, uint64_t size)
+{
+       return (size > 1 && (start + size < start));
+}
+
 /*
   Open up the brlock.tdb database. Close it down using
   talloc_free(). We need the messaging_ctx to allow for
@@ -299,6 +306,10 @@ static NTSTATUS brl_tdb_lock(struct brl_context *brl,
        kbuf.dptr = brlh->key.data;
        kbuf.dsize = brlh->key.length;
 
+       if (brl_invalid_lock_range(start, size)) {
+               return NT_STATUS_INVALID_LOCK_RANGE;
+       }
+
        if (tdb_chainlock(brl->w->tdb, kbuf) != 0) {
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
@@ -449,6 +460,10 @@ static NTSTATUS brl_tdb_unlock(struct brl_context *brl,
        kbuf.dptr = brlh->key.data;
        kbuf.dsize = brlh->key.length;
 
+       if (brl_invalid_lock_range(start, size)) {
+               return NT_STATUS_INVALID_LOCK_RANGE;
+       }
+
        if (tdb_chainlock(brl->w->tdb, kbuf) != 0) {
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
@@ -620,6 +635,10 @@ static NTSTATUS brl_tdb_locktest(struct brl_context *brl,
        kbuf.dptr = brlh->key.data;
        kbuf.dsize = brlh->key.length;
 
+       if (brl_invalid_lock_range(start, size)) {
+               return NT_STATUS_INVALID_LOCK_RANGE;
+       }
+
        dbuf = tdb_fetch(brl->w->tdb, kbuf);
        if (dbuf.dptr == NULL) {
                return NT_STATUS_OK;
index d564db72ff24bf1077bd1d8883e29bcdbd043003..3319539b63d5361844aacbf4faff120bcfe6be62 100644 (file)
@@ -1116,12 +1116,6 @@ NTSTATUS ntvfs_map_lock(struct ntvfs_module_context *ntvfs,
                        isunlock = false;
                }
                for (i=0;i<lck->smb2.in.lock_count;i++) {
-                       if (lck->smb2.in.locks[i].length > 1 &&
-                           lck->smb2.in.locks[i].offset +
-                           lck->smb2.in.locks[i].length <
-                           lck->smb2.in.locks[i].offset) {
-                               return NT_STATUS_INVALID_LOCK_RANGE;
-                       }
                        if (lck->smb2.in.locks[i].flags == SMB2_LOCK_FLAG_NONE) {
                                return NT_STATUS_INVALID_PARAMETER;
                        }