#include "oplock_break_handler.h"
#include "system/network.h"
#include "lib/util/util_net.h"
-#include "torture/smb2/block.h"
#include "lease_break_handler.h"
#define BASEDIR "multichanneltestdir"
/* windows 2016 returns 300000 0x493E0 */
}
+/*
+ * We simulate blocking incoming oplock break requests by simply ignoring
+ * the incoming break requests.
+ */
+static void test_set_ignore_break_handler(struct smb2_transport *transport)
+{
+ transport->oplock.handler = torture_oplock_ignore_handler;
+ transport->lease.handler = torture_lease_ignore_handler;
+}
+
+static void test_reset_break_handler(struct smb2_transport *transport)
+{
+ transport->oplock.handler = torture_oplock_ack_handler;
+ transport->lease.handler = torture_lease_handler;
+}
+
/*
* Oplock break - Test 1
* open file1 in session 2A
struct smbcli_options transport2_options;
struct smb2_session *session1 = tree1->session;
uint16_t local_port = 0;
- bool block_ok = false;
- bool unblock_ok = false;
DATA_BLOB blob;
if (!test_multichannel_initial_checks(tctx, tree1))
transport2 = break_info.received_transport;
torture_reset_break_info(tctx, &break_info);
- /* block transport which is used by the server for oplock breaks */
- block_ok = torture_block_tcp_transport(tctx, transport2);
- torture_assert(tctx, block_ok, "we could not block tcp transport");
+ /* ignore incoming oplock/lease break handlers */
+ test_set_ignore_break_handler(transport2);
torture_comment(tctx, "client1 opens fname2 via session 1\n");
io2.in.oplock_level = smb2_util_oplock_level("b");
CHECK_CREATED(&io2, EXISTED, FILE_ATTRIBUTE_ARCHIVE);
CHECK_VAL(io2.out.oplock_level, smb2_util_oplock_level("s"));
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2);
- torture_assert(tctx, unblock_ok, "we could not unblock tcp transport");
+ /* reset incoming oplock/lease break handlers */
+ test_reset_break_handler(transport2);
/* disconnect transport2 */
/*
CHECK_VAL(break_info.count, 1);
done:
- if (block_ok && !unblock_ok) {
- /* unblock tcp connection of transport2 */
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2);
- }
-
tree1->session = session1;
smb2_util_close(tree1, h_client1_file1);
struct smbcli_options transport2_options;
struct smb2_session *session1 = tree1->session;
uint16_t local_port = 0;
- bool block_ok = false;
- bool unblock_ok = false;
struct smb2_lease ls1;
struct smb2_lease ls2;
struct smb2_lease ls3;
test_multichannel_free_channels2(tree2A, tree2B, tree2C);
tree2A = tree2B = tree2C = NULL;
done:
- if (block_ok && !unblock_ok) {
- /* unblock tcp connection of transport2C */
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2C);
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2A);
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2B);
- }
-
tree1->session = session1;
smb2_util_close(tree1, h_client1_file1);
struct smbcli_options transport2_options;
struct smb2_session *session1 = tree1->session;
uint16_t local_port = 0;
- bool block_ok = false;
- bool unblock_ok = false;
struct smb2_lease ls1;
struct smb2_lease ls2;
struct smb2_lease ls3;
torture_comment(tctx, "Blocking 2B and 2C\n");
/* Block 2B and 2C */
- block_ok = torture_block_tcp_transport(tctx, transport2B);
- block_ok |= torture_block_tcp_transport(tctx, transport2C);
- torture_assert(tctx, block_ok, "we could not block tcp transport");
+ test_set_ignore_break_handler(transport2B);
+ test_set_ignore_break_handler(transport2C);
/*
* 1 opens file2
/* Unblock 2B and 2C */
torture_comment(tctx, "Unblocking 2B and 2C\n");
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2B);
- unblock_ok |= torture_unblock_tcp_transport(tctx, transport2C);
- torture_assert(tctx, unblock_ok, "we could not unblock tcp transport");
- torture_unblock_cleanup(tctx);
+ test_reset_break_handler(transport2B);
+ test_reset_break_handler(transport2C);
/* Will this trigger pending break? */
smb2_keepalive(transport2B);
tree2A = tree2B = tree2C = NULL;
done:
- if (block_ok && !unblock_ok) {
- /* unblock tcp connection of transport2C */
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2C);
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2B);
- }
-
tree1->session = session1;
smb2_util_close(tree1, h_client1_file1);
struct smbcli_options transport2_options;
struct smb2_session *session1 = tree1->session;
uint16_t local_port = 0;
- bool block_ok = false;
- bool unblock_ok = false;
struct smb2_lease ls1;
struct smb2_lease ls2;
struct smb2_lease ls3;
torture_reset_lease_break_info(tctx, &lease_break_info);
/* Block 2B */
- block_ok = torture_block_tcp_transport(tctx, transport2B);
- torture_assert(tctx, block_ok, "we could not block tcp transport");
+ test_set_ignore_break_handler(transport2B);
/*
* 1 opens file2
"failed to write file2 via channel 2A");
/* Unblock 2B */
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2B);
- torture_assert(tctx, unblock_ok, "we could not unblock tcp transport");
+ test_reset_break_handler(transport2B);
smb2_util_close(tree1, h_client1_file1);
smb2_util_close(tree1, h_client1_file2);
tree2A = tree2B = tree2C = NULL;
done:
- if (block_ok && !unblock_ok) {
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2B);
- }
-
tree1->session = session1;
smb2_util_close(tree1, h_client1_file1);
struct smbcli_options transport2_options;
struct smb2_session *session1 = tree1->session;
uint16_t local_port = 0;
- bool block_ok = false;
- bool unblock_ok = false;
struct smb2_lease ls1;
struct smb2_lease ls2;
struct smb2_lease ls3;
torture_comment(tctx, "Blocking 2A\n");
/* Block 2A */
- block_ok = torture_block_tcp_transport(tctx, transport2A);
- torture_assert(tctx, block_ok, "we could not block tcp transport");
+ test_set_ignore_break_handler(transport2A);
/*
* 1 opens file2
/* Unblock 2A */
torture_comment(tctx, "Unblocking 2A\n");
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2A);
- torture_assert(tctx, unblock_ok, "we could not unblock tcp transport");
+ test_reset_break_handler(transport2A);
/*
* 1 opens file1
tree2A = tree2B = tree2C = NULL;
done:
- if (block_ok && !unblock_ok) {
- unblock_ok = torture_unblock_tcp_transport(tctx, transport2A);
- }
- torture_unblock_cleanup(tctx);
-
tree1->session = session1;
smb2_util_close(tree1, h_client1_file1);