summaryrefslogtreecommitdiffstats
path: root/libcli
diff options
context:
space:
mode:
authorAnubhav Rakshit <anubhav.rakshit@gmail.com>2014-07-10 16:46:04 +0530
committerMichael Adam <obnox@samba.org>2014-09-19 09:15:10 +0200
commit4c64d41cfcb7b0bb30929aefd8bcd735449c83c3 (patch)
tree7dc5378eaf584e797c5b95e3e629f8981ad778ba /libcli
parent2a8a6edfef9fc56c8b002dcc615a4666fc476a49 (diff)
downloadsamba-4c64d41cfcb7b0bb30929aefd8bcd735449c83c3.tar.gz
samba-4c64d41cfcb7b0bb30929aefd8bcd735449c83c3.tar.xz
samba-4c64d41cfcb7b0bb30929aefd8bcd735449c83c3.zip
libcli/smb: Add routines to enable/disable SMB2_HDR_FLAG_REPLAY_OPERATION flag.
Signed-off-by: Anubhav Rakshit <anubhav.rakshit@gmail.com> Reviewed-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'libcli')
-rw-r--r--libcli/smb/smbXcli_base.c20
-rw-r--r--libcli/smb/smbXcli_base.h2
2 files changed, 22 insertions, 0 deletions
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 472c6e6263..6c367aeb94 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -140,6 +140,7 @@ struct smb2cli_session {
uint64_t nonce_high;
uint64_t nonce_low;
uint16_t channel_sequence;
+ bool replay_active;
};
struct smbXcli_session {
@@ -2632,6 +2633,7 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
uint64_t uid = 0;
bool use_channel_sequence = false;
uint16_t channel_sequence = 0;
+ bool use_replay_flag = false;
req = tevent_req_create(mem_ctx, &state,
struct smbXcli_req_state);
@@ -2650,6 +2652,10 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
use_channel_sequence = true;
}
+ if (smbXcli_conn_protocol(conn) >= PROTOCOL_SMB3_00) {
+ use_replay_flag = true;
+ }
+
if (session) {
uid = session->smb2->session_id;
@@ -2657,6 +2663,10 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
channel_sequence = session->smb2->channel_sequence;
}
+ if (use_replay_flag && session->smb2->replay_active) {
+ additional_flags |= SMB2_HDR_FLAG_REPLAY_OPERATION;
+ }
+
state->smb2.should_sign = session->smb2->should_sign;
state->smb2.should_encrypt = session->smb2->should_encrypt;
@@ -4780,6 +4790,16 @@ uint16_t smb2cli_session_reset_channel_sequence(struct smbXcli_session *session,
return prev_cs;
}
+void smb2cli_session_start_replay(struct smbXcli_session *session)
+{
+ session->smb2->replay_active = true;
+}
+
+void smb2cli_session_stop_replay(struct smbXcli_session *session)
+{
+ session->smb2->replay_active = false;
+}
+
NTSTATUS smb2cli_session_set_session_key(struct smbXcli_session *session,
const DATA_BLOB _session_key,
const struct iovec *recv_iov)
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 4a771ac9ff..e0c90b59d4 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -382,6 +382,8 @@ void smb2cli_session_set_id_and_flags(struct smbXcli_session *session,
void smb2cli_session_increment_channel_sequence(struct smbXcli_session *session);
uint16_t smb2cli_session_reset_channel_sequence(struct smbXcli_session *session,
uint16_t channel_sequence);
+void smb2cli_session_start_replay(struct smbXcli_session *session);
+void smb2cli_session_stop_replay(struct smbXcli_session *session);
NTSTATUS smb2cli_session_set_session_key(struct smbXcli_session *session,
const DATA_BLOB session_key,
const struct iovec *recv_iov);