diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/libsmb/clientgen.c | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 31af1e7e24..6bc8d0ce70 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -454,9 +454,7 @@ time_t cli_state_server_time(struct cli_state *cli) } struct cli_echo_state { - uint16_t vwv[1]; - DATA_BLOB data; - int num_echos; + bool is_smb2; }; static void cli_echo_done(struct tevent_req *subreq); @@ -472,20 +470,25 @@ struct tevent_req *cli_echo_send(TALLOC_CTX *mem_ctx, struct event_context *ev, if (req == NULL) { return NULL; } - SSVAL(state->vwv, 0, num_echos); - state->data = data; - state->num_echos = num_echos; - subreq = cli_smb_send(state, ev, cli, SMBecho, 0, 1, state->vwv, - data.length, data.data); - if (subreq == NULL) { - goto fail; + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { + state->is_smb2 = true; + subreq = smb2cli_echo_send(state, ev, + cli->conn, + cli->timeout); + } else { + subreq = smb1cli_echo_send(state, ev, + cli->conn, + cli->timeout, + num_echos, + data); + } + if (tevent_req_nomem(subreq, req)) { + return tevent_req_post(req, ev); } tevent_req_set_callback(subreq, cli_echo_done, req); + return req; - fail: - TALLOC_FREE(req); - return NULL; } static void cli_echo_done(struct tevent_req *subreq) @@ -495,31 +498,19 @@ static void cli_echo_done(struct tevent_req *subreq) struct cli_echo_state *state = tevent_req_data( req, struct cli_echo_state); NTSTATUS status; - uint32_t num_bytes; - uint8_t *bytes; - status = cli_smb_recv(subreq, state, NULL, 0, NULL, NULL, - &num_bytes, &bytes); + if (state->is_smb2) { + status = smb2cli_echo_recv(subreq); + } else { + status = smb1cli_echo_recv(subreq); + } + TALLOC_FREE(subreq); if (!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); return; } - if ((num_bytes != state->data.length) - || (memcmp(bytes, state->data.data, num_bytes) != 0)) { - tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE); - return; - } - state->num_echos -=1; - if (state->num_echos == 0) { - tevent_req_done(req); - return; - } - - if (!smbXcli_req_set_pending(subreq)) { - tevent_req_nterror(req, NT_STATUS_NO_MEMORY); - return; - } + tevent_req_done(req); } /** |