1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-09 08:58:35 +03:00

selftest: add a durable handle test with delayed disconnect

Bug: https://bugzilla.samba.org/show_bug.cgi?id=13549

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit 5508024a861e7c85e6c837552ad142aa1d5e8eca)
This commit is contained in:
Ralph Boehme 2018-08-30 19:15:19 +02:00 committed by Karolin Seeger
parent 99ef099d0d
commit c77edea016
7 changed files with 132 additions and 1 deletions

View File

@ -0,0 +1 @@
^samba3.blackbox.durable_v2_delay.durable_v2_delay\(simpleserver:local\)

View File

@ -2175,6 +2175,14 @@ sub provision($$$$$$$$$)
copy = tmp
vfs objects = error_inject
include = $libdir/error_inject.conf
[delay_inject]
copy = tmp
vfs objects = delay_inject
kernel share modes = no
kernel oplocks = no
posix locking = no
include = $libdir/delay_inject.conf
";
close(CONF);

View File

@ -0,0 +1,21 @@
#!/bin/sh
#
# Test Durable Handle reconnect with injected delay in the disconnect.
#
# Copyright (C) 2018 Ralph Boehme
. $(dirname $0)/../../../testprogs/blackbox/subunit.sh
failed=0
delay_inject_conf=$(dirname $SMB_CONF_PATH)/delay_inject.conf
echo 'delay_inject:ntimes = 5000' > $delay_inject_conf
testit "durable_v2_delay" $VALGRIND \
$BINDIR/smbtorture //$SERVER_IP/delay_inject \
-U$USERNAME%$PASSWORD smb2.durable-v2-delay ||
failed=$(expr $failed + 1)
rm $delay_inject_conf
testok $0 $failed

View File

@ -464,7 +464,7 @@ for t in tests:
elif t == "rpc.samr.passwords.validate":
plansmbtorture4testsuite(t, "nt4_dc", 'ncacn_ip_tcp:$SERVER_IP[seal] -U$USERNAME%$PASSWORD', 'over ncacn_ip_tcp ')
plansmbtorture4testsuite(t, "ad_dc", 'ncacn_ip_tcp:$SERVER_IP[seal] -U$USERNAME%$PASSWORD', 'over ncacn_ip_tcp ')
elif t == "smb2.durable-open" or t == "smb2.durable-v2-open" or t == "smb2.replay":
elif t == "smb2.durable-open" or t == "smb2.durable-v2-open" or t == "smb2.replay" or t == "smb2.durable-v2-delay":
plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/durable -U$USERNAME%$PASSWORD')
plansmbtorture4testsuite(t, "ad_dc", '//$SERVER_IP/durable -U$USERNAME%$PASSWORD')
elif t == "base.rw1":
@ -627,6 +627,9 @@ plantestsuite("samba3.blackbox.net_tdb", "simpleserver:local",
plantestsuite("samba3.blackbox.smbd_error", "simpleserver:local",
[ os.path.join(samba3srcdir, "script/tests/test_smbd_error.sh") ])
plantestsuite("samba3.blackbox.durable_v2_delay", "simpleserver:local",
[os.path.join(samba3srcdir, "script/tests/test_durable_handle_reconnect.sh")])
plantestsuite("samba3.blackbox.net_cache_samlogon", "ad_member:local",
[ os.path.join(samba3srcdir, "script/tests/test_net_cache_samlogon.sh"),
'$SERVER', 'tmp', '$DC_USERNAME', '$DC_PASSWORD'])

View File

@ -315,6 +315,7 @@ smb2_s3only = [
"smb2.dosmode",
"smb2.credits",
"smb2.kernel-oplocks",
"smb2.durable-v2-delay",
]
smb2 = [x for x in smbtorture4_testsuites("smb2.") if x not in smb2_s3only]

View File

@ -2035,3 +2035,98 @@ struct torture_suite *torture_smb2_durable_v2_open_init(TALLOC_CTX *ctx)
return suite;
}
/**
* basic test for doing a durable open
* tcp disconnect, reconnect, do a durable reopen (succeeds)
*/
static bool test_durable_v2_reconnect_delay(struct torture_context *tctx,
struct smb2_tree *tree)
{
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(tctx);
char fname[256];
struct smb2_handle _h;
struct smb2_handle *h = NULL;
struct smb2_create io;
struct GUID create_guid = GUID_random();
struct smbcli_options options;
uint64_t previous_session_id;
uint8_t b = 0;
bool ret = true;
options = tree->session->transport->options;
previous_session_id = smb2cli_session_current_id(tree->session->smbXcli);
/* Choose a random name in case the state is left a little funky. */
snprintf(fname, 256, "durable_v2_reconnect_delay_%s.dat",
generate_random_str(tctx, 8));
smb2_util_unlink(tree, fname);
smb2_oplock_create_share(&io, fname,
smb2_util_share_access(""),
smb2_util_oplock_level("b"));
io.in.durable_open = false;
io.in.durable_open_v2 = true;
io.in.persistent_open = false;
io.in.create_guid = create_guid;
io.in.timeout = 0;
status = smb2_create(tree, mem_ctx, &io);
CHECK_STATUS(status, NT_STATUS_OK);
_h = io.out.file.handle;
h = &_h;
CHECK_VAL(io.out.oplock_level, smb2_util_oplock_level("b"));
CHECK_VAL(io.out.durable_open_v2, true);
status = smb2_util_write(tree, *h, &b, 0, 1);
CHECK_STATUS(status, NT_STATUS_OK);
/* disconnect, leaving the durable open */
TALLOC_FREE(tree);
if (!torture_smb2_connection_ext(tctx, previous_session_id,
&options, &tree)) {
torture_warning(tctx, "couldn't reconnect, bailing\n");
ret = false;
goto done;
}
ZERO_STRUCT(io);
io.in.fname = fname;
io.in.durable_open_v2 = false;
io.in.durable_handle_v2 = h;
io.in.create_guid = create_guid;
h = NULL;
status = smb2_create(tree, mem_ctx, &io);
CHECK_STATUS(status, NT_STATUS_OK);
CHECK_VAL(io.out.oplock_level, smb2_util_oplock_level("b"));
_h = io.out.file.handle;
h = &_h;
done:
if (h != NULL) {
smb2_util_close(tree, *h);
}
smb2_util_unlink(tree, fname);
talloc_free(tree);
talloc_free(mem_ctx);
return ret;
}
struct torture_suite *torture_smb2_durable_v2_delay_init(TALLOC_CTX *ctx)
{
struct torture_suite *suite =
torture_suite_create(ctx, "durable-v2-delay");
torture_suite_add_1smb2_test(suite, "durable_v2_reconnect_delay", test_durable_v2_reconnect_delay);
return suite;
}

View File

@ -163,6 +163,8 @@ NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
torture_smb2_durable_open_disconnect_init(suite));
torture_suite_add_suite(suite,
torture_smb2_durable_v2_open_init(suite));
torture_suite_add_suite(suite,
torture_smb2_durable_v2_delay_init(suite));
torture_suite_add_suite(suite, torture_smb2_dir_init(suite));
torture_suite_add_suite(suite, torture_smb2_lease_init(suite));
torture_suite_add_suite(suite, torture_smb2_compound_init(suite));