diff options
Diffstat (limited to 'libcli/smb')
-rw-r--r-- | libcli/smb/smbXcli_base.c | 20 | ||||
-rw-r--r-- | libcli/smb/smbXcli_base.h | 2 |
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); |