diff options
author | David Disseldorp <ddiss@samba.org> | 2013-10-19 03:47:07 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2013-10-25 22:48:59 +0200 |
commit | 68427f1e974d324bf82154eb46b3d981f534e0e8 (patch) | |
tree | eec3dce95a16144f9d56a2db78ecc0141dd701eb /source4/torture/smb2 | |
parent | a13fda747238c5780d10bdf80b00edd8c2d1f6d3 (diff) | |
download | samba-68427f1e974d324bf82154eb46b3d981f534e0e8.tar.gz samba-68427f1e974d324bf82154eb46b3d981f534e0e8.tar.bz2 samba-68427f1e974d324bf82154eb46b3d981f534e0e8.zip |
torture: add FSCTL_SRV_COPYCHUNK_WRITE access test
Check that FSCTL_SRV_COPYCHUNK_WRITE succeeds when the copy-chunk target
is opened with SEC_RIGHTS_FILE_WRITE only.
Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Oct 25 22:48:59 CEST 2013 on sn-devel-104
Diffstat (limited to 'source4/torture/smb2')
-rw-r--r-- | source4/torture/smb2/ioctl.c | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c index 75379af0e6..fa9e190d19 100644 --- a/source4/torture/smb2/ioctl.c +++ b/source4/torture/smb2/ioctl.c @@ -1236,8 +1236,7 @@ static bool test_ioctl_copy_chunk_bad_access(struct torture_context *torture, /* * FSCTL_SRV_COPYCHUNK requires read permission on dest, - * FSCTL_SRV_COPYCHUNK_WRITE (not supported by Samba) on the other hand - * does not. + * FSCTL_SRV_COPYCHUNK_WRITE on the other hand does not. */ status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2); torture_assert_ntstatus_equal(torture, status, @@ -1251,6 +1250,54 @@ static bool test_ioctl_copy_chunk_bad_access(struct torture_context *torture, return true; } +static bool test_ioctl_copy_chunk_write_access(struct torture_context *torture, + struct smb2_tree *tree) +{ + struct smb2_handle src_h; + struct smb2_handle dest_h; + NTSTATUS status; + union smb_ioctl ioctl; + TALLOC_CTX *tmp_ctx = talloc_new(tree); + struct srv_copychunk_copy cc_copy; + enum ndr_err_code ndr_ret; + bool ok; + + /* no read permission on dest with FSCTL_SRV_COPYCHUNK_WRITE */ + ok = test_setup_copy_chunk(torture, tree, tmp_ctx, + 1, /* 1 chunk */ + &src_h, 4096, /* fill 4096 byte src file */ + SEC_RIGHTS_FILE_ALL, + &dest_h, 0, /* 0 byte dest file */ + (SEC_RIGHTS_FILE_WRITE + | SEC_RIGHTS_FILE_EXECUTE), + &cc_copy, + &ioctl); + if (!ok) { + torture_fail(torture, "setup copy chunk error"); + } + + ioctl.smb2.in.function = FSCTL_SRV_COPYCHUNK_WRITE; + cc_copy.chunks[0].source_off = 0; + cc_copy.chunks[0].target_off = 0; + cc_copy.chunks[0].length = 4096; + + ndr_ret = ndr_push_struct_blob(&ioctl.smb2.in.out, tmp_ctx, + &cc_copy, + (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy); + torture_assert_ndr_success(torture, ndr_ret, + "ndr_push_srv_copychunk_copy"); + + status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2); + torture_assert_ntstatus_ok(torture, status, + "FSCTL_SRV_COPYCHUNK_WRITE"); + + smb2_util_close(tree, src_h); + smb2_util_close(tree, dest_h); + talloc_free(tmp_ctx); + + return true; +} + static bool test_ioctl_copy_chunk_src_exceed(struct torture_context *torture, struct smb2_tree *tree) { @@ -2068,6 +2115,8 @@ struct torture_suite *torture_smb2_ioctl_init(void) test_ioctl_copy_chunk_src_is_dest_overlap); torture_suite_add_1smb2_test(suite, "copy_chunk_bad_access", test_ioctl_copy_chunk_bad_access); + torture_suite_add_1smb2_test(suite, "copy_chunk_write_access", + test_ioctl_copy_chunk_write_access); torture_suite_add_1smb2_test(suite, "copy_chunk_src_exceed", test_ioctl_copy_chunk_src_exceed); torture_suite_add_1smb2_test(suite, "copy_chunk_src_exceed_multi", |