*/
struct cli_state *prev, *next;
int fd;
- uint16 cnum;
uint16 vuid;
int protocol;
int sec_mode;
uint16_t mid;
uint16_t pid;
uint16_t vc_num;
+ uint16_t tid;
} smb1;
struct {
cli_setup_packet_buf(cli, (char *)state->header);
SCVAL(state->header, smb_com, smb_command);
- SSVAL(state->header, smb_tid, cli->cnum);
+ SSVAL(state->header, smb_tid, cli->smb1.tid);
SCVAL(state->header, smb_wct, wct);
state->vwv = vwv;
cli->dfsroot = ((SVAL(vwv+2, 0) & SMB_SHARE_IN_DFS) != 0);
}
- cli->cnum = SVAL(inbuf,smb_tid);
+ cli->smb1.tid = SVAL(inbuf,smb_tid);
tevent_req_done(req);
}
tevent_req_nterror(req, status);
return;
}
- state->cli->cnum = -1;
+ state->cli->smb1.tid = UINT16_MAX;
tevent_req_done(req);
}
struct cli_negprot_state *state;
uint8_t *bytes = NULL;
int numprots;
- uint16_t cnum;
req = tevent_req_create(mem_ctx, &state, struct cli_negprot_state);
if (req == NULL) {
}
}
- cnum = cli->cnum;
-
- cli->cnum = 0;
subreq = cli_smb_send(state, ev, cli, SMBnegprot, 0, 0, NULL,
talloc_get_size(bytes), bytes);
- cli->cnum = cnum;
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
return false;
}
- cnum = cli->cnum;
+ cnum = cli_state_get_tid(cli);
/* special case. never check for a referral on the IPC$ share */
return false;
}
- cli->cnum = cnum;
+ cli_state_set_tid(cli, cnum);
if (!res || !num_refs) {
return false;
}
cli->fd = -1;
cli->raw_status = NT_STATUS_INTERNAL_ERROR;
- cli->cnum = -1;
cli->vuid = UID_FIELD_INVALID;
cli->protocol = PROTOCOL_NT1;
cli->timeout = 20000; /* Timeout is in milliseconds. */
cli->smb1.mid = 1;
cli->smb1.pid = (uint16_t)sys_getpid();
cli->smb1.vc_num = cli->smb1.pid;
+ cli->smb1.tid = UINT16_MAX;
return cli;
* later. This tree disconnect forces the peer to clean up, since the
* connection will be going away.
*/
- if (cli->cnum != (uint16)-1) {
+ if (cli_state_has_tcon(cli)) {
cli_tdis(cli);
}
return cli->smb1.pid;
}
+bool cli_state_has_tcon(struct cli_state *cli)
+{
+ if (cli->smb1.tid == UINT16_MAX) {
+ return false;
+ }
+
+ return true;
+}
+
+uint16_t cli_state_get_tid(struct cli_state *cli)
+{
+ return cli->smb1.tid;
+}
+
+uint16_t cli_state_set_tid(struct cli_state *cli, uint16_t tid)
+{
+ uint16_t ret = cli->smb1.tid;
+ cli->smb1.tid = tid;
+ return ret;
+}
+
/****************************************************************************
Set the case sensitivity flag on the packets. Returns old state.
****************************************************************************/
* i.e., a normal share or a referred share from
* 'msdfs proxy' share.
*/
- if (srv->cli->cnum == (uint16) -1) {
+ if (!cli_state_has_tcon(srv->cli)) {
/* Ensure we have accurate auth info */
SMBC_call_auth_fn(ctx, context,
srv->cli->desthost,
uint16_t cli_state_get_vc_num(struct cli_state *cli);
uint16 cli_setpid(struct cli_state *cli, uint16 pid);
uint16_t cli_getpid(struct cli_state *cli);
+bool cli_state_has_tcon(struct cli_state *cli);
+uint16_t cli_state_get_tid(struct cli_state *cli);
+uint16_t cli_state_set_tid(struct cli_state *cli, uint16_t tid);
bool cli_set_case_sensitive(struct cli_state *cli, bool case_sensitive);
struct tevent_req *cli_echo_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
struct cli_state *cli, uint16_t num_echos,
return False;
}
- cnum1 = cli->cnum;
+ cnum1 = cli_state_get_tid(cli);
vuid1 = cli->vuid;
status = cli_writeall(cli, fnum1, 0, (uint8_t *)buf, 130, 4, NULL);
return False;
}
- cnum2 = cli->cnum;
+ cnum2 = cli_state_get_tid(cli);
cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */
vuid2 = cli->vuid + 1;
/* try a write with the wrong tid */
- cli->cnum = cnum2;
+ cli_state_set_tid(cli, cnum2);
status = cli_writeall(cli, fnum1, 0, (uint8_t *)buf, 130, 4, NULL);
if (NT_STATUS_IS_OK(status)) {
/* try a write with an invalid tid */
- cli->cnum = cnum3;
+ cli_state_set_tid(cli, cnum3);
status = cli_writeall(cli, fnum1, 0, (uint8_t *)buf, 130, 4, NULL);
if (NT_STATUS_IS_OK(status)) {
/* try a write with an invalid vuid */
cli->vuid = vuid2;
- cli->cnum = cnum1;
+ cli_state_set_tid(cli, cnum1);
status = cli_writeall(cli, fnum1, 0, (uint8_t *)buf, 130, 4, NULL);
if (NT_STATUS_IS_OK(status)) {
nt_errstr(status));
}
- cli->cnum = cnum1;
+ cli_state_set_tid(cli, cnum1);
cli->vuid = vuid1;
status = cli_close(cli, fnum1);
return False;
}
- cli->cnum = cnum2;
+ cli_state_set_tid(cli, cnum2);
status = cli_tdis(cli);
if (!NT_STATUS_IS_OK(status)) {
return False;
}
- cli->cnum = cnum1;
+ cli_state_set_tid(cli, cnum1);
if (!torture_close_connection(cli)) {
return False;
}
cli2->vuid = cli1->vuid;
- cli2->cnum = cli1->cnum;
+ cli_state_set_tid(cli2, cli_state_get_tid(cli1));
cli_setpid(cli2, cli_getpid(cli1));
if (cli_read(cli2, fnum1, buf, 0, 13) == 13) {
if (!torture_cli_session_setup2(cli, &new_vuid))
return False;
- saved_cnum = cli->cnum;
+ saved_cnum = cli_state_get_tid(cli);
if (!NT_STATUS_IS_OK(cli_tcon_andx(cli, share, "?????", "", 1)))
return False;
- new_cnum = cli->cnum;
- cli->cnum = saved_cnum;
+ new_cnum = cli_state_get_tid(cli);
+ cli_state_set_tid(cli, saved_cnum);
printf("starting fdsesstest\n");
cli->vuid = saved_vuid;
/* Try with same vuid, different cnum. */
- cli->cnum = new_cnum;
+ cli_state_set_tid(cli, new_cnum);
if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
printf("read succeeded with different cnum![%s]\n",
ret = False;
}
- cli->cnum = saved_cnum;
+ cli_state_set_tid(cli, saved_cnum);
cli_close(cli, fnum1);
cli_unlink(cli, fname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
}
}
- old_cnum = cli->cnum;
+ old_cnum = cli_state_get_tid(cli);
/* Now try a SMBtdis with the invald vuid set to zero. */
cli->vuid = 0;
}
cli->vuid = old_vuid;
- cli->cnum = old_cnum;
+ cli_state_set_tid(cli, old_cnum);
/* This should fail. */
status = cli_tdis(cli);
netname));
}
- cnum = cli->cnum;
+ cnum = cli_state_get_tid(cli);
if (!NT_STATUS_IS_OK(cli_tcon_andx(cli, netname, "A:", "", 0))) {
return;
if (fnum != (uint16_t)-1)
cli_close(cli, fnum);
cli_tdis(cli);
- cli->cnum = cnum;
+ cli_state_set_tid(cli, cnum);
return;
}
enum lsa_SidType *type,
char **domain, char **name)
{
- uint16 orig_cnum = cli->cnum;
+ uint16 orig_cnum = cli_state_get_tid(cli);
struct rpc_pipe_client *p = NULL;
struct policy_handle handle;
NTSTATUS status;
fail:
TALLOC_FREE(p);
cli_tdis(cli);
- cli->cnum = orig_cnum;
+ cli_state_set_tid(cli, orig_cnum);
TALLOC_FREE(frame);
return status;
}
enum lsa_SidType *type,
struct dom_sid *sid)
{
- uint16 orig_cnum = cli->cnum;
+ uint16 orig_cnum = cli_state_get_tid(cli);
struct rpc_pipe_client *p;
struct policy_handle handle;
NTSTATUS status;
fail:
TALLOC_FREE(p);
cli_tdis(cli);
- cli->cnum = orig_cnum;
+ cli_state_set_tid(cli, orig_cnum);
TALLOC_FREE(frame);
return status;
}