[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Mon May 16 14:39:02 MDT 2011


The branch, master has been updated
       via  8cf14c2 Fix the SMB2 showstopper, found by an extended torture test from Volker.
       via  fe21bdc Ensure we always write the correct incoming mid into the share mode table entries.
      from  a032c9c s3-rpc_server: Force ncalrpc dir to be mode 755.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8cf14c21b3bc55454728bf48b23f696e15c92aea
Author: Jeremy Allison <jra at samba.org>
Date:   Mon May 16 12:20:14 2011 -0700

    Fix the SMB2 showstopper, found by an extended torture test from Volker.
    
    In the oplock refactoring, the algorithm underwent an unnoticed change.
    In 3.5.x stat_opens were silently (i.e. no explicit code had comments
    explaining this) ignored when looking for oplock breaks and share mode
    violations. After the refactoring, the function find_oplock_types()
    no longer ignored stat_open entries in the share mode table when looking
    for batch and exclusive oplocks. This patch adds two changes to find_oplock_types()
    to ignore the case where the incoming open request is a stat open being
    tested against existing opens, and also when the incoming open request
    is a non-stat open being tested against existing stat opens. Neither
    of these cause an oplock break or share mode violation. Thanks a *lot*
    to Volker, who persevered in reproducing this problem.
    
    Autobuild-User: Jeremy Allison <jra at samba.org>
    Autobuild-Date: Mon May 16 22:38:20 CEST 2011 on sn-devel-104

commit fe21bdc43c0aeacfc8592998e6a90f6f83c939e0
Author: Jeremy Allison <jra at samba.org>
Date:   Mon May 16 10:41:51 2011 -0700

    Ensure we always write the correct incoming mid into the share mode
    table entries.

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/onefs_open.c |    6 ++++--
 source3/smbd/open.c          |   34 +++++++++++++++++++++++++++++-----
 2 files changed, 33 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/onefs_open.c b/source3/modules/onefs_open.c
index 6ab47d7..101dc5b 100644
--- a/source3/modules/onefs_open.c
+++ b/source3/modules/onefs_open.c
@@ -1310,7 +1310,8 @@ NTSTATUS onefs_open_file_ntcreate(connection_struct *conn,
 		new_file_created = True;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0,
+	set_share_mode(lck, fsp, get_current_uid(conn),
+			req ? req->mid : 0,
 		       fsp->oplock_type);
 
 	/* Handle strange delete on close create semantics. */
@@ -1666,7 +1667,8 @@ static NTSTATUS onefs_open_directory(connection_struct *conn,
 		return NT_STATUS_DELETE_PENDING;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0, NO_OPLOCK);
+	set_share_mode(lck, fsp, get_current_uid(conn),
+		req ? req->mid : 0, NO_OPLOCK);
 
 	/*
 	 * For directories the delete on close bit at open time seems
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 076ae1f..bb7e6c2 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -949,7 +949,9 @@ static NTSTATUS send_break_message(files_struct *fsp,
  * Do internal consistency checks on the share mode for a file.
  */
 
-static void find_oplock_types(struct share_mode_lock *lck,
+static void find_oplock_types(files_struct *fsp,
+				int oplock_request,
+				struct share_mode_lock *lck,
 				struct share_mode_entry **pp_batch,
 				struct share_mode_entry **pp_ex_or_batch,
 				bool *got_level2,
@@ -962,11 +964,27 @@ static void find_oplock_types(struct share_mode_lock *lck,
 	*got_level2 = false;
 	*got_no_oplock = false;
 
+	/* Ignore stat or internal opens, as is done in
+		delay_for_batch_oplocks() and
+		delay_for_exclusive_oplocks().
+	 */
+	if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
+		return;
+	}
+
 	for (i=0; i<lck->num_share_modes; i++) {
 		if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
 			continue;
 		}
 
+		if (lck->share_modes[i].op_type == NO_OPLOCK &&
+				is_stat_open(lck->share_modes[i].access_mask)) {
+			/* We ignore stat opens in the table - they
+			   always have NO_OPLOCK and never get or
+			   cause breaks. JRA. */
+			continue;
+		}
+
 		if (BATCH_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
 			/* batch - can only be one. */
 			if (*pp_ex_or_batch || *pp_batch || *got_level2 || *got_no_oplock) {
@@ -1906,7 +1924,9 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		}
 
 		/* Get the types we need to examine. */
-		find_oplock_types(lck,
+		find_oplock_types(fsp,
+				oplock_request,
+				lck,
 				&batch_entry,
 				&exclusive_entry,
 				&got_level2_oplock,
@@ -2151,7 +2171,9 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		}
 
 		/* Get the types we need to examine. */
-		find_oplock_types(lck,
+		find_oplock_types(fsp,
+				oplock_request,
+				lck,
 				&batch_entry,
 				&exclusive_entry,
 				&got_level2_oplock,
@@ -2335,7 +2357,8 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		new_file_created = True;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0,
+	set_share_mode(lck, fsp, get_current_uid(conn),
+			req ? req->mid : 0,
 		       fsp->oplock_type);
 
 	/* Handle strange delete on close create semantics. */
@@ -2828,7 +2851,8 @@ static NTSTATUS open_directory(connection_struct *conn,
 		return status;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0, NO_OPLOCK);
+	set_share_mode(lck, fsp, get_current_uid(conn),
+			req ? req->mid : 0, NO_OPLOCK);
 
 	/* For directories the delete on close bit at open time seems
 	   always to be honored on close... See test 19 in Samba4 BASE-DELETE. */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list