[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