]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:smbd: add disconnected checks to the open code.
authorStefan Metzmacher <metze@samba.org>
Sat, 4 Aug 2012 13:30:11 +0000 (15:30 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 8 Sep 2012 01:39:06 +0000 (03:39 +0200)
(delay_for_batch_oplocks, open_mode_check, and delay_for_exclusive_oplocks)

Pair-Programmed-With: Michael Adam <obnox@samba.org>

source3/smbd/open.c

index 9c4ba369cdc583021946d3919c3e1c3d311e41de..e919b1392e568e47bce0eda191f7b40af2453ac7 100644 (file)
@@ -29,6 +29,7 @@
 #include "../librpc/gen_ndr/ndr_security.h"
 #include "../librpc/gen_ndr/open_files.h"
 #include "auth.h"
+#include "serverid.h"
 #include "messages.h"
 
 extern const struct generic_mapping file_generic_mapping;
@@ -917,6 +918,14 @@ static bool share_conflict(struct share_mode_entry *entry,
                  (unsigned int)entry->share_access,
                  (unsigned int)entry->private_options));
 
+       if (server_id_is_disconnected(&entry->pid)) {
+               /*
+                * note: cleanup should have been done by
+                * delay_for_batch_oplocks()
+                */
+               return false;
+       }
+
        DEBUG(10,("share_conflict: access_mask = 0x%x, share_access = 0x%x\n",
                  (unsigned int)access_mask, (unsigned int)share_access));
 
@@ -1298,6 +1307,19 @@ static bool delay_for_batch_oplocks(files_struct *fsp,
                return false;
        }
 
+       if (server_id_is_disconnected(&batch_entry->pid)) {
+               /*
+                * TODO: clean up.
+                * This could be achieved by sending a break message
+                * to ourselves. Special considerations for files
+                * with delete_on_close flag set!
+                *
+                * For now we keep it simple and do not
+                * allow delete on close for durable handles.
+                */
+               return false;
+       }
+
        /* Found a batch oplock */
        send_break_message(fsp, batch_entry, mid, oplock_request);
        return true;
@@ -1317,6 +1339,15 @@ static bool delay_for_exclusive_oplocks(files_struct *fsp,
                return false;
        }
 
+       if (server_id_is_disconnected(&ex_entry->pid)) {
+               /*
+                * since only durable handles can get disconnected,
+                * and we can only get durable handles with batch oplocks,
+                * this should actually never be reached...
+                */
+               return false;
+       }
+
        /* Found an exclusive or batch oplock */
 
        delay_it = is_delete_request(fsp) ?