[SCM] Samba Shared Repository - branch master updated

Tim Prouty tprouty at samba.org
Tue Dec 1 12:42:16 MST 2009


The branch, master has been updated
       via  ae64978... s3: Fix smbd to correctly return INVALID_LEVEL on set_file_end_of_file_info for paths
       via  4e8b6c5... s4 torture: Change oplock to use passthrough for exclusive3/batch11
       via  5035a90... s4 torture: Update RAW-SFILEINFO-END-OF-FILE to test some additional corner cases
       via  5a934fd... Revert "s4 torture: Allow onefs to be checked like samba3 and samba4"
       via  66bf780... s4 torture: Change RAW-SFILEINFO-END-OF-FILE to check for share modes by default
       via  2738e31... s4 torture: Move target macros to a common header instead of redefining them in multiple files
      from  9d8867f... s3:build: fix detection of CTDB headers on systems without system-libtalloc

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


- Log -----------------------------------------------------------------
commit ae649782df6e22c8e1922aaa03c248e5af68a036
Author: Tim Prouty <tprouty at samba.org>
Date:   Tue Dec 1 10:47:08 2009 -0800

    s3: Fix smbd to correctly return INVALID_LEVEL on set_file_end_of_file_info for paths
    
    This allows smbd to pass the freshly updated RAW-SFILEINFO-END-OF-FILE
    torture test.

commit 4e8b6c5992494e1177cd98e47d96498a259b9056
Author: Tim Prouty <tprouty at samba.org>
Date:   Mon Nov 30 16:43:00 2009 -0800

    s4 torture: Change oplock to use passthrough for exclusive3/batch11
    
    In light of the INVALID_LEVEL that is seen for RAW_SFILEINFO_END_OF_FILE_INFO
    requests on a path, I'm changing these back to using the passthrough
    RAW_SFILEINFO_END_OF_FILE_INFORMATION to test the oplock break behavior as
    originally intended

commit 5035a900051c7946346d4e8b32e8f13f802ce5be
Author: Tim Prouty <tprouty at samba.org>
Date:   Mon Nov 30 11:59:19 2009 -0800

    s4 torture: Update RAW-SFILEINFO-END-OF-FILE to test some additional corner cases
    
    It turns out setting the end-of-file with Trans2SetPathInfo using the
    snia spec's info level will attempt to open the file, enforcing share
    modes, but then subsequentlys fail the setpathinfo with a dos error of
    INVALID_LEVEL.  Doing a Trans2SetFileInfo with either end-of-file info
    level succeeds as expected.

commit 5a934fd8da61196d829a601a85b9871b226239d4
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Nov 25 14:26:18 2009 -0800

    Revert "s4 torture: Allow onefs to be checked like samba3 and samba4"
    
    This reverts commit 98f595036e196dd61340fef0faf63ca762a25307.
    
    No longer necessary

commit 66bf780e6edac110b85d2a0d08d01274fe7417bd
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Nov 25 14:40:54 2009 -0800

    s4 torture: Change RAW-SFILEINFO-END-OF-FILE to check for share modes by default
    
    Since the windows behavior appears to be a bug, only check for
    the windows-style share mode bug if target=<windows variant> is
    specified

commit 2738e316746b078899dd30e07665d8e7b515581e
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Nov 25 14:38:55 2009 -0800

    s4 torture: Move target macros to a common header instead of redefining them in multiple files

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

Summary of changes:
 source3/smbd/trans2.c             |   31 ++++++++--
 source4/torture/raw/lock.c        |    5 --
 source4/torture/raw/oplock.c      |    4 +-
 source4/torture/raw/setfileinfo.c |  129 ++++++++++++++++++++++++++++++-------
 source4/torture/smb2/create.c     |    2 -
 source4/torture/smbtorture.c      |    1 -
 source4/torture/util.h            |    8 ++
 7 files changed, 142 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 2892e26..5f50b64 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -5538,7 +5538,8 @@ static NTSTATUS smb_set_file_size(connection_struct *conn,
 				  files_struct *fsp,
 				  const struct smb_filename *smb_fname,
 				  const SMB_STRUCT_STAT *psbuf,
-				  SMB_OFF_T size)
+				  SMB_OFF_T size,
+				  bool fail_after_createfile)
 {
 	NTSTATUS status = NT_STATUS_OK;
 	struct smb_filename *smb_fname_tmp = NULL;
@@ -5598,6 +5599,12 @@ static NTSTATUS smb_set_file_size(connection_struct *conn,
 		return status;
 	}
 
+	/* See RAW-SFILEINFO-END-OF-FILE */
+	if (fail_after_createfile) {
+		close_file(req, new_fsp,NORMAL_CLOSE);
+		return NT_STATUS_INVALID_LEVEL;
+	}
+
 	if (vfs_set_filelen(new_fsp, size) == -1) {
 		status = map_nt_error_from_unix(errno);
 		close_file(req, new_fsp,NORMAL_CLOSE);
@@ -6474,7 +6481,8 @@ static NTSTATUS smb_set_file_end_of_file_info(connection_struct *conn,
 					const char *pdata,
 					int total_data,
 					files_struct *fsp,
-					const struct smb_filename *smb_fname)
+					const struct smb_filename *smb_fname,
+					bool fail_after_createfile)
 {
 	SMB_OFF_T size;
 
@@ -6499,7 +6507,8 @@ static NTSTATUS smb_set_file_end_of_file_info(connection_struct *conn,
 				fsp,
 				smb_fname,
 				&smb_fname->st,
-				size);
+				size,
+				fail_after_createfile);
 }
 
 /****************************************************************************
@@ -6785,7 +6794,8 @@ static NTSTATUS smb_set_file_unix_basic(connection_struct *conn,
 				   fsp,
 				   smb_fname,
 				   &sbuf,
-				   size);
+				   size,
+				   false);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -7381,11 +7391,22 @@ NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn,
 		case SMB_FILE_END_OF_FILE_INFORMATION:
 		case SMB_SET_FILE_END_OF_FILE_INFO:
 		{
+			/*
+			 * XP/Win7 both fail after the createfile with
+			 * SMB_SET_FILE_END_OF_FILE_INFO but not
+			 * SMB_FILE_END_OF_FILE_INFORMATION (pass-through).
+			 * The level is known here, so pass it down
+			 * appropriately.
+			 */
+			bool should_fail =
+			    (info_level == SMB_SET_FILE_END_OF_FILE_INFO);
+
 			status = smb_set_file_end_of_file_info(conn, req,
 								pdata,
 								total_data,
 								fsp,
-								smb_fname);
+								smb_fname,
+								should_fail);
 			break;
 		}
 
diff --git a/source4/torture/raw/lock.c b/source4/torture/raw/lock.c
index 1ccba61..610cac9 100644
--- a/source4/torture/raw/lock.c
+++ b/source4/torture/raw/lock.c
@@ -69,11 +69,6 @@
 	}} while (0)
 #define BASEDIR "\\testlock"
 
-#define TARGET_IS_W2K8(_tctx) (torture_setting_bool(_tctx, "w2k8", false))
-#define TARGET_IS_WIN7(_tctx) (torture_setting_bool(_tctx, "win7", false))
-#define TARGET_IS_SAMBA3(_tctx) (torture_setting_bool(_tctx, "samba3", false))
-#define TARGET_IS_SAMBA4(_tctx) (torture_setting_bool(_tctx, "samba4", false))
-
 /*
   test SMBlock and SMBunlock ops
 */
diff --git a/source4/torture/raw/oplock.c b/source4/torture/raw/oplock.c
index 0ebbb38..283fed2 100644
--- a/source4/torture/raw/oplock.c
+++ b/source4/torture/raw/oplock.c
@@ -463,7 +463,7 @@ static bool test_raw_oplock_exclusive3(struct torture_context *tctx, struct smbc
 
 	torture_comment(tctx, "setpathinfo EOF should trigger a break to none\n");
 	ZERO_STRUCT(sfi);
-	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFO;
+	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
 	sfi.generic.in.file.path = fname;
 	sfi.end_of_file_info.in.size = 100;
 
@@ -1530,7 +1530,7 @@ static bool test_raw_oplock_batch11(struct torture_context *tctx, struct smbcli_
 	CHECK_VAL(io.ntcreatex.out.oplock_level, BATCH_OPLOCK_RETURN);
 
 	ZERO_STRUCT(sfi);
-	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFO;
+	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
 	sfi.generic.in.file.path = fname;
 	sfi.end_of_file_info.in.size = 100;
 
diff --git a/source4/torture/raw/setfileinfo.c b/source4/torture/raw/setfileinfo.c
index 0aa1f38..42f4f32 100644
--- a/source4/torture/raw/setfileinfo.c
+++ b/source4/torture/raw/setfileinfo.c
@@ -700,9 +700,14 @@ static bool torture_raw_sfileinfo_bug(struct torture_context *torture,
 	return true;
 }
 
+/**
+ * Test both the snia cifs RAW_SFILEINFO_END_OF_FILE_INFO and the undocumented
+ * pass-through RAW_SFILEINFO_END_OF_FILE_INFORMATION in the context of
+ * trans2setpathinfo.
+ */
 static bool
-torture_raw_sfileinfo_eof(struct torture_context *tctx, struct smbcli_state *cli1,
-    struct smbcli_state *cli2)
+torture_raw_sfileinfo_eof(struct torture_context *tctx,
+    struct smbcli_state *cli1, struct smbcli_state *cli2)
 {
 	const char *fname = BASEDIR "\\test_sfileinfo_end_of_file.dat";
 	NTSTATUS status;
@@ -772,43 +777,121 @@ torture_raw_sfileinfo_eof(struct torture_context *tctx, struct smbcli_state *cli
 	 * Looks like a windows bug:
 	 * http://lists.samba.org/archive/cifs-protocol/2009-November/001130.html
 	 */
-	if (torture_setting_bool(tctx, "samba3", false) ||
-	    torture_setting_bool(tctx, "samba4", false) ||
-	    torture_setting_bool(tctx, "onefs", false)) {
+	if (TARGET_IS_W2K8(tctx) || TARGET_IS_WIN7(tctx)) {
+		/* It succeeds! This is just weird! */
+		torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK,
+		    ret, done, "Status should be OK");
+
+		/* Verify that the file was actually extended to 100. */
+		ZERO_STRUCT(qfi);
+		qfi.generic.level = RAW_FILEINFO_STANDARD_INFO;
+		qfi.generic.in.file.path = fname;
+		status = smb_raw_pathinfo(cli2->tree, tctx, &qfi);
+		torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK,
+		    ret, done, "Status should be OK");
+
+		torture_assert_u64_equal(tctx, qfi.standard_info.out.size, 100,
+		    "alloc_size should be 100 since the setpathinfo "
+		    "succeeded.");
+	} else {
 		torture_assert_ntstatus_equal_goto(tctx, status,
 		    NT_STATUS_SHARING_VIOLATION, ret, done, "Status should be "
 		    "SHARING_VIOLATION");
-		goto done;
+	}
+
+	/* close the first file. */
+	smbcli_close(cli1->tree, fnum);
+	fnum = 0;
+
+	/* Try to sfileinfo to extend the file again (non-pass-through). */
+	ZERO_STRUCT(sfi);
+	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFO;
+	sfi.generic.in.file.path = fname;
+	sfi.end_of_file_info.in.size = 200;
+	status = smb_raw_setpathinfo(cli2->tree, &sfi);
+
+	/* This should cause the client to retun invalid level. */
+	if (TARGET_IS_W2K8(tctx) || TARGET_IS_WIN7(tctx)) {
+		/*
+		 * Windows sends back an invalid packet that smbclient sees
+		 * and returns INTERNAL_ERROR.
+		 */
+		torture_assert_ntstatus_equal_goto(tctx, status,
+		    NT_STATUS_INTERNAL_ERROR, ret, done, "Status should be "
+		    "INTERNAL_ERROR");
 	} else {
-		/* It succeeds! This is just weird! */
-		torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
-		    done, "Status should be OK");
+		torture_assert_ntstatus_equal_goto(tctx, status,
+		    NT_STATUS_INVALID_LEVEL, ret, done, "Status should be "
+		    "INVALID_LEVEL");
 	}
 
-	/* Verify that the file was actually extended to 100. */
+	/* Try to extend the file now with the passthrough level. */
+	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
+	status = smb_raw_setpathinfo(cli2->tree, &sfi);
+	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
+	    done, "Status should be OK");
+
+	/* Verify that the file was actually extended to 200. */
 	ZERO_STRUCT(qfi);
 	qfi.generic.level = RAW_FILEINFO_STANDARD_INFO;
 	qfi.generic.in.file.path = fname;
 	status = smb_raw_pathinfo(cli2->tree, tctx, &qfi);
+
 	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
 	    done, "Status should be OK");
+	torture_assert_u64_equal(tctx, qfi.standard_info.out.size, 200,
+	    "alloc_size should be 200 since the setpathinfo succeeded.");
 
-	torture_assert_u64_equal(tctx, qfi.standard_info.out.size, 100,
-	    "alloc_size should be 100 since the setpathinfo succeeded.");
+	/* Open the file so end of file can be set by handle. */
+	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_WRITE;
+	status = smb_raw_open(cli1->tree, tctx, &io);
+	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
+	    done, "Status should be OK");
+	fnum = io.ntcreatex.out.file.fnum;
 
-	/*
-	 * Try another open with just write to mimic what setpathinfo should
-	 * be doing under the covers.
-	 */
-	io.ntcreatex.in.access_mask = SEC_FILE_WRITE_DATA;
-	status = smb_raw_open(cli2->tree, tctx, &io);
-	torture_assert_ntstatus_equal_goto(tctx, status,
-	    NT_STATUS_SHARING_VIOLATION, ret, done, "Status should be "
-	    "SHARING_VIOLATION");
+	/* Try sfileinfo to extend the file by handle (non-pass-through). */
+	ZERO_STRUCT(sfi);
+	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFO;
+	sfi.generic.in.file.fnum = fnum;
+	sfi.end_of_file_info.in.size = 300;
+	status = smb_raw_setfileinfo(cli1->tree, &sfi);
+	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
+	    done, "Status should be OK");
 
-	smbcli_close(cli1->tree, fnum);
+	/* Verify that the file was actually extended to 300. */
+	ZERO_STRUCT(qfi);
+	qfi.generic.level = RAW_FILEINFO_STANDARD_INFO;
+	qfi.generic.in.file.path = fname;
+	status = smb_raw_pathinfo(cli1->tree, tctx, &qfi);
+	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
+	    done, "Status should be OK");
+	torture_assert_u64_equal(tctx, qfi.standard_info.out.size, 300,
+	    "alloc_size should be 300 since the setpathinfo succeeded.");
+
+	/* Try sfileinfo to extend the file by handle (pass-through). */
+	ZERO_STRUCT(sfi);
+	sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
+	sfi.generic.in.file.fnum = fnum;
+	sfi.end_of_file_info.in.size = 400;
+	status = smb_raw_setfileinfo(cli1->tree, &sfi);
+	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
+	    done, "Status should be OK");
+
+	/* Verify that the file was actually extended to 300. */
+	ZERO_STRUCT(qfi);
+	qfi.generic.level = RAW_FILEINFO_STANDARD_INFO;
+	qfi.generic.in.file.path = fname;
+	status = smb_raw_pathinfo(cli1->tree, tctx, &qfi);
+	torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
+	    done, "Status should be OK");
+	torture_assert_u64_equal(tctx, qfi.standard_info.out.size, 400,
+	    "alloc_size should be 400 since the setpathinfo succeeded.");
+ done:
+	if (fnum > 0) {
+		smbcli_close(cli1->tree, fnum);
+		fnum = 0;
+	}
 
-done:
 	smb_raw_exit(cli1->session);
 	smb_raw_exit(cli2->session);
 	smbcli_deltree(cli1->tree, BASEDIR);
diff --git a/source4/torture/smb2/create.c b/source4/torture/smb2/create.c
index f93567f..b006047 100644
--- a/source4/torture/smb2/create.c
+++ b/source4/torture/smb2/create.c
@@ -126,8 +126,6 @@
 		       __location__, sattrib, fname); \
 	}} while (0)
 
-#define TARGET_IS_WIN7(_tctx) (torture_setting_bool(_tctx, "win7", false))
-
 /*
   test some interesting combinations found by gentest
  */
diff --git a/source4/torture/smbtorture.c b/source4/torture/smbtorture.c
index 51d82ae..b9ed521 100644
--- a/source4/torture/smbtorture.c
+++ b/source4/torture/smbtorture.c
@@ -535,7 +535,6 @@ int main(int argc,char *argv[])
 		     "0x00010000");
 	} else if (strcmp(target, "onefs") == 0) {
 		lp_set_cmdline(cmdline_lp_ctx, "torture:sacl_support", "false");
-		lp_set_cmdline(cmdline_lp_ctx, "torture:onefs", "true");
 	}
 
 	if (max_runtime) {
diff --git a/source4/torture/util.h b/source4/torture/util.h
index 501d14d..3566241 100644
--- a/source4/torture/util.h
+++ b/source4/torture/util.h
@@ -26,6 +26,14 @@ struct smbcli_state;
 struct smbcli_tree;
 
 /**
+ * Useful target macros for handling server bugs in torture tests.
+ */
+#define TARGET_IS_W2K8(_tctx) (torture_setting_bool(_tctx, "w2k8", false))
+#define TARGET_IS_WIN7(_tctx) (torture_setting_bool(_tctx, "win7", false))
+#define TARGET_IS_SAMBA3(_tctx) (torture_setting_bool(_tctx, "samba3", false))
+#define TARGET_IS_SAMBA4(_tctx) (torture_setting_bool(_tctx, "samba4", false))
+
+/**
   setup a directory ready for a test
 */
 _PUBLIC_ bool torture_setup_dir(struct smbcli_state *cli, const char *dname);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list