1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

s4-smbtorture: pin copychunk exec right behavior

Add tests that show copychunk behavior when the
source and dest handles have execute right instead
of read-data right.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12149

Signed-off-by: Uri Simchoni <uri@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>
This commit is contained in:
Uri Simchoni 2016-08-04 13:12:58 +03:00 committed by David Disseldorp
parent 6ce0304eda
commit 5bf11f6f5b
2 changed files with 76 additions and 26 deletions

View File

@ -289,3 +289,7 @@
#new read tests fail
^samba4.smb2.read.access
^samba3.smb2.read.access
#new copychunk tests fail
^samba4.smb2.ioctl.copy_chunk_bad_access
^samba3.smb2.ioctl.copy_chunk_bad_access
^samba3.smb2.ioctl fs_specific.copy_chunk_bad_access

View File

@ -1255,16 +1255,66 @@ static bool test_ioctl_copy_chunk_bad_access(struct torture_context *torture,
struct srv_copychunk_copy cc_copy;
enum ndr_err_code ndr_ret;
bool ok;
/* no read permission on src */
ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
1, /* 1 chunk */
/* read permission on src */
ok = test_setup_copy_chunk(torture, tree, tmp_ctx, 1, /* 1 chunk */
&src_h, 4096, /* fill 4096 byte src file */
SEC_RIGHTS_FILE_WRITE,
&dest_h, 0, /* 0 byte dest file */
SEC_RIGHTS_FILE_ALL,
&cc_copy,
&ioctl);
SEC_FILE_READ_DATA | SEC_FILE_READ_ATTRIBUTE,
&dest_h, 0, /* 0 byte dest file */
SEC_RIGHTS_FILE_ALL, &cc_copy, &ioctl);
if (!ok) {
torture_fail(torture, "setup copy chunk error");
}
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_equal(torture, status, NT_STATUS_OK,
"FSCTL_SRV_COPYCHUNK");
smb2_util_close(tree, src_h);
smb2_util_close(tree, dest_h);
/* execute permission on src */
ok = test_setup_copy_chunk(torture, tree, tmp_ctx, 1, /* 1 chunk */
&src_h, 4096, /* fill 4096 byte src file */
SEC_FILE_EXECUTE | SEC_FILE_READ_ATTRIBUTE,
&dest_h, 0, /* 0 byte dest file */
SEC_RIGHTS_FILE_ALL, &cc_copy, &ioctl);
if (!ok) {
torture_fail(torture, "setup copy chunk error");
}
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_equal(torture, status, NT_STATUS_OK,
"FSCTL_SRV_COPYCHUNK");
smb2_util_close(tree, src_h);
smb2_util_close(tree, dest_h);
/* neither read nor execute permission on src */
ok = test_setup_copy_chunk(torture, tree, tmp_ctx, 1, /* 1 chunk */
&src_h, 4096, /* fill 4096 byte src file */
SEC_FILE_READ_ATTRIBUTE, &dest_h,
0, /* 0 byte dest file */
SEC_RIGHTS_FILE_ALL, &cc_copy, &ioctl);
if (!ok) {
torture_fail(torture, "setup copy chunk error");
}
@ -1288,15 +1338,14 @@ static bool test_ioctl_copy_chunk_bad_access(struct torture_context *torture,
smb2_util_close(tree, dest_h);
/* no write permission on dest */
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_READ
| SEC_RIGHTS_FILE_EXECUTE),
&cc_copy,
&ioctl);
ok = test_setup_copy_chunk(
torture, tree, tmp_ctx, 1, /* 1 chunk */
&src_h, 4096, /* fill 4096 byte src file */
SEC_FILE_READ_DATA | SEC_FILE_READ_ATTRIBUTE, &dest_h,
0, /* 0 byte dest file */
(SEC_RIGHTS_FILE_ALL &
~(SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA)),
&cc_copy, &ioctl);
if (!ok) {
torture_fail(torture, "setup copy chunk error");
}
@ -1320,15 +1369,12 @@ static bool test_ioctl_copy_chunk_bad_access(struct torture_context *torture,
smb2_util_close(tree, dest_h);
/* no read permission on dest */
ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
1, /* 1 chunk */
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);
SEC_FILE_READ_DATA | SEC_FILE_READ_ATTRIBUTE,
&dest_h, 0, /* 0 byte dest file */
(SEC_RIGHTS_FILE_ALL & ~SEC_FILE_READ_DATA),
&cc_copy, &ioctl);
if (!ok) {
torture_fail(torture, "setup copy chunk error");
}