From cf68b647b3a839c9ffe31a508ac167f897fc0d04 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 13 Jun 2017 16:26:00 -0700 Subject: [PATCH] s3: libsmb: Widen cli_state_get_tid() / cli_state_set_tid() to 32-bits. Copes with SMB2 connections. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12831 Signed-off-by: Jeremy Allison Reviewed-by: Richard Sharpe (cherry picked from commit 93fa0c8660e47cb2605d70dac1156576ab719d64) --- source3/client/client.c | 5 ++++- source3/lib/util_sd.c | 4 ++-- source3/libsmb/clidfs.c | 2 +- source3/libsmb/clientgen.c | 22 ++++++++++++++++------ source3/libsmb/proto.h | 4 ++-- source3/torture/torture.c | 8 ++++---- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/source3/client/client.c b/source3/client/client.c index e7531d347aa..c173cf4f007 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -4673,7 +4673,10 @@ static int cmd_tid(void) d_printf("no tcon currently\n"); } } else { - uint16_t tid = atoi(tid_str); + uint32_t tid = atoi(tid_str); + if (!cli_state_has_tcon(cli)) { + d_printf("no tcon currently\n"); + } cli_state_set_tid(cli, tid); } diff --git a/source3/lib/util_sd.c b/source3/lib/util_sd.c index 9a7b34fa5d7..ca699a948a8 100644 --- a/source3/lib/util_sd.c +++ b/source3/lib/util_sd.c @@ -84,7 +84,7 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli, enum lsa_SidType *type, char **domain, char **name) { - uint16_t orig_cnum = cli_state_get_tid(cli); + uint32_t orig_cnum = cli_state_get_tid(cli); struct rpc_pipe_client *p = NULL; struct policy_handle handle; NTSTATUS status; @@ -165,7 +165,7 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli, enum lsa_SidType *type, struct dom_sid *sid) { - uint16_t orig_cnum = cli_state_get_tid(cli); + uint32_t orig_cnum = cli_state_get_tid(cli); struct rpc_pipe_client *p; struct policy_handle handle; NTSTATUS status; diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c index d2a4c194f44..5d29314d4ab 100644 --- a/source3/libsmb/clidfs.c +++ b/source3/libsmb/clidfs.c @@ -1179,7 +1179,7 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx, size_t consumed = 0; char *fullpath = NULL; bool res; - uint16_t cnum; + uint32_t cnum; char *newextrapath = NULL; NTSTATUS status; const char *remote_name; diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 1aea4cf247e..25f72991956 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -341,7 +341,7 @@ uint32_t cli_getpid(struct cli_state *cli) bool cli_state_has_tcon(struct cli_state *cli) { - uint16_t tid = cli_state_get_tid(cli); + uint32_t tid = cli_state_get_tid(cli); if (tid == UINT16_MAX) { return false; @@ -350,15 +350,25 @@ bool cli_state_has_tcon(struct cli_state *cli) return true; } -uint16_t cli_state_get_tid(struct cli_state *cli) +uint32_t cli_state_get_tid(struct cli_state *cli) { - return smb1cli_tcon_current_id(cli->smb1.tcon); + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { + return smb2cli_tcon_current_id(cli->smb2.tcon); + } else { + return (uint32_t)smb1cli_tcon_current_id(cli->smb1.tcon); + } } -uint16_t cli_state_set_tid(struct cli_state *cli, uint16_t tid) +uint32_t cli_state_set_tid(struct cli_state *cli, uint32_t tid) { - uint16_t ret = smb1cli_tcon_current_id(cli->smb1.tcon); - smb1cli_tcon_set_id(cli->smb1.tcon, tid); + uint32_t ret; + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { + ret = smb2cli_tcon_current_id(cli->smb2.tcon); + smb2cli_tcon_set_id(cli->smb1.tcon, tid); + } else { + ret = smb1cli_tcon_current_id(cli->smb1.tcon); + smb1cli_tcon_set_id(cli->smb1.tcon, tid); + } return ret; } diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h index 225da072768..340cd225ea0 100644 --- a/source3/libsmb/proto.h +++ b/source3/libsmb/proto.h @@ -175,8 +175,8 @@ uint16_t cli_state_get_vc_num(struct cli_state *cli); uint32_t cli_setpid(struct cli_state *cli, uint32_t pid); uint32_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); +uint32_t cli_state_get_tid(struct cli_state *cli); +uint32_t cli_state_set_tid(struct cli_state *cli, uint32_t tid); struct smbXcli_tcon; struct smbXcli_tcon *cli_state_save_tcon(struct cli_state *cli); void cli_state_restore_tcon(struct cli_state *cli, struct smbXcli_tcon *tcon); diff --git a/source3/torture/torture.c b/source3/torture/torture.c index f8567c67089..d895f6ac73f 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -1309,7 +1309,7 @@ static bool run_tcon_test(int dummy) static struct cli_state *cli; const char *fname = "\\tcontest.tmp"; uint16_t fnum1; - uint16_t cnum1, cnum2, cnum3; + uint32_t cnum1, cnum2, cnum3; uint16_t vuid1, vuid2; char buf[4]; bool ret = True; @@ -2769,8 +2769,8 @@ static bool run_fdsesstest(int dummy) struct cli_state *cli; uint16_t new_vuid; uint16_t saved_vuid; - uint16_t new_cnum; - uint16_t saved_cnum; + uint32_t new_cnum; + uint32_t saved_cnum; const char *fname = "\\fdsess.tst"; const char *fname1 = "\\fdsess1.tst"; uint16_t fnum1; @@ -8873,7 +8873,7 @@ static bool run_uid_regression_test(int dummy) { static struct cli_state *cli; int16_t old_vuid; - int16_t old_cnum; + int32_t old_cnum; bool correct = True; NTSTATUS status; -- 2.47.2