summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorChristof Schmitt <cs@samba.org>2018-09-28 16:37:51 -0700
committerAndrew Bartlett <abartlet@samba.org>2019-07-05 03:33:19 +0000
commite1bb3d34d900730c71ceaf2a1fba23823342f94e (patch)
treebbc32f9d6f3b244d87677813e370296629855c48 /source4
parentaa199696b9cf16660a7f8f2bcc2940153a855c41 (diff)
downloadsamba-e1bb3d34d900730c71ceaf2a1fba23823342f94e.tar.gz
smbtorture: Add smb2.ioctl.zero_data
Allow to manually issue the FSCTL_ZERO_DATA call and verify the state of the file in the file system. Signed-off-by: Christof Schmitt <cs@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'source4')
-rw-r--r--source4/torture/smb2/ioctl.c61
-rw-r--r--source4/torture/smb2/smb2.c2
2 files changed, 63 insertions, 0 deletions
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c
index 39aedba7cc8..eed81d1f598 100644
--- a/source4/torture/smb2/ioctl.c
+++ b/source4/torture/smb2/ioctl.c
@@ -3894,6 +3894,67 @@ err_out:
return status;
}
+bool test_ioctl_zero_data(struct torture_context *tctx)
+{
+ bool ret = true;
+ int offset, beyond_final_zero;
+ const char *filename;
+ NTSTATUS status;
+ struct smb2_create create = { };
+ struct smb2_tree *tree = NULL;
+
+ offset = torture_setting_int(tctx, "offset", -1);
+
+ if (offset < 0) {
+ torture_fail(tctx, "Need to provide non-negative offset "
+ "through --option=torture:offset=NNN\n");
+ return false;
+ }
+
+ beyond_final_zero = torture_setting_int(tctx, "beyond_final_zero",
+ -1);
+ if (beyond_final_zero < 0) {
+ torture_fail(tctx, "Need to provide non-negative "
+ "'beyond final zero' through "
+ "--option=torture:beyond_final_zero=NNN\n");
+ return false;
+ }
+ filename = torture_setting_string(tctx, "filename", NULL);
+ if (filename == NULL) {
+ torture_fail(tctx, "Need to provide filename through "
+ "--option=torture:filename=testfile\n");
+ return false;
+ }
+
+ if (!torture_smb2_connection(tctx, &tree)) {
+ torture_comment(tctx, "Initializing smb2 connection failed.\n");
+ return false;
+ }
+
+ create.in.desired_access = SEC_RIGHTS_DIR_ALL;
+ create.in.create_options = 0;
+ create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
+ create.in.share_access = NTCREATEX_SHARE_ACCESS_READ |
+ NTCREATEX_SHARE_ACCESS_WRITE |
+ NTCREATEX_SHARE_ACCESS_DELETE;
+ create.in.create_disposition = NTCREATEX_DISP_OPEN;
+ create.in.fname = filename;
+
+ status = smb2_create(tree, tctx, &create);
+ torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
+ "CREATE failed.\n");
+
+ status = test_ioctl_zdata_req(tctx, tctx, tree,
+ create.out.file.handle,
+ offset,
+ beyond_final_zero);
+ torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
+ "FSCTL_ZERO_DATA failed.\n");
+
+done:
+ return ret;
+}
+
static bool test_ioctl_sparse_punch(struct torture_context *torture,
struct smb2_tree *tree)
{
diff --git a/source4/torture/smb2/smb2.c b/source4/torture/smb2/smb2.c
index 56df0ddaafe..f495c19d251 100644
--- a/source4/torture/smb2/smb2.c
+++ b/source4/torture/smb2/smb2.c
@@ -177,6 +177,8 @@ NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
torture_suite_add_suite(suite, torture_smb2_ioctl_init(suite));
torture_suite_add_simple_test(suite, "set-sparse-ioctl",
test_ioctl_set_sparse);
+ torture_suite_add_simple_test(suite, "zero-data-ioctl",
+ test_ioctl_zero_data);
torture_suite_add_suite(suite, torture_smb2_rename_init(suite));
torture_suite_add_1smb2_test(suite, "bench-oplock", test_smb2_bench_oplock);
torture_suite_add_suite(suite, torture_smb2_sharemode_init(suite));