]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: libsmb: Correctly save and restore connection tcon in smbclient, smbcacls and...
authorJeremy Allison <jra@samba.org>
Tue, 13 Jun 2017 23:56:48 +0000 (16:56 -0700)
committerKarolin Seeger <kseeger@samba.org>
Fri, 30 Jun 2017 08:46:22 +0000 (10:46 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12831

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Richard Sharpe <realrichardsharpe@gmail.com>
(cherry picked from commit bd31d538a26bb21cbb53986a6105204da4392e2d)

source3/lib/util_sd.c
source3/libsmb/clidfs.c
source3/torture/torture.c
source3/utils/net_rpc.c
source3/utils/smbcacls.c

index ca699a948a8406f02f3ab81d60ff3315bc56d1ee..4c46d4cf8a8dbb08cddaae023b3bb37dfea94690 100644 (file)
@@ -84,7 +84,7 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
                                   enum lsa_SidType *type,
                                   char **domain, char **name)
 {
-       uint32_t orig_cnum = cli_state_get_tid(cli);
+       struct smbXcli_tcon *orig_tcon = NULL;
        struct rpc_pipe_client *p = NULL;
        struct policy_handle handle;
        NTSTATUS status;
@@ -93,6 +93,14 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
        char **domains;
        char **names;
 
+       if (cli_state_has_tcon(cli)) {
+               orig_tcon = cli_state_save_tcon(cli);
+               if (orig_tcon == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto tcon_fail;
+               }
+       }
+
        status = cli_tree_connect(cli, "IPC$", "?????", "", 0);
        if (!NT_STATUS_IS_OK(status)) {
                goto tcon_fail;
@@ -125,7 +133,7 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
        TALLOC_FREE(p);
        cli_tdis(cli);
  tcon_fail:
-       cli_state_set_tid(cli, orig_cnum);
+       cli_state_restore_tcon(cli, orig_tcon);
        TALLOC_FREE(frame);
        return status;
 }
@@ -165,7 +173,7 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
                                    enum lsa_SidType *type,
                                    struct dom_sid *sid)
 {
-       uint32_t orig_cnum = cli_state_get_tid(cli);
+       struct smbXcli_tcon *orig_tcon = NULL;
        struct rpc_pipe_client *p;
        struct policy_handle handle;
        NTSTATUS status;
@@ -173,6 +181,14 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
        struct dom_sid *sids;
        enum lsa_SidType *types;
 
+       if (cli_state_has_tcon(cli)) {
+               orig_tcon = cli_state_save_tcon(cli);
+               if (orig_tcon == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto tcon_fail;
+               }
+       }
+
        status = cli_tree_connect(cli, "IPC$", "?????", "", 0);
        if (!NT_STATUS_IS_OK(status)) {
                goto tcon_fail;
@@ -204,7 +220,7 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
        TALLOC_FREE(p);
        cli_tdis(cli);
  tcon_fail:
-       cli_state_set_tid(cli, orig_cnum);
+       cli_state_restore_tcon(cli, orig_tcon);
        TALLOC_FREE(frame);
        return status;
 }
index 5d29314d4ab3afa50d10cd3c5137f1eaaba5cc92..16b21bdf6de3d7cd3bc39630c10e280aa6f3e20b 100644 (file)
@@ -1179,7 +1179,7 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
        size_t consumed = 0;
        char *fullpath = NULL;
        bool res;
-       uint32_t cnum;
+       struct smbXcli_tcon *orig_tcon = NULL;
        char *newextrapath = NULL;
        NTSTATUS status;
        const char *remote_name;
@@ -1189,7 +1189,6 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
        }
 
        remote_name = smbXcli_conn_remote_name(cli->conn);
-       cnum = cli_state_get_tid(cli);
 
        /* special case.  never check for a referral on the IPC$ share */
 
@@ -1204,9 +1203,18 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
                return false;
        }
 
+       /* Store tcon state. */
+       if (cli_state_has_tcon(cli)) {
+               orig_tcon = cli_state_save_tcon(cli);
+               if (orig_tcon == NULL) {
+                       return false;
+               }
+       }
+
        /* check for the referral */
 
        if (!NT_STATUS_IS_OK(cli_tree_connect(cli, "IPC$", "IPC", NULL, 0))) {
+               cli_state_restore_tcon(cli, orig_tcon);
                return false;
        }
 
@@ -1217,6 +1225,7 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
                                        domain,
                                        "IPC$");
                if (!NT_STATUS_IS_OK(status)) {
+                       cli_state_restore_tcon(cli, orig_tcon);
                        return false;
                }
        }
@@ -1226,12 +1235,13 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
        res = NT_STATUS_IS_OK(status);
 
        status = cli_tdis(cli);
+
+       cli_state_restore_tcon(cli, orig_tcon);
+
        if (!NT_STATUS_IS_OK(status)) {
                return false;
        }
 
-       cli_state_set_tid(cli, cnum);
-
        if (!res || !num_refs) {
                return false;
        }
index d895f6ac73f611cb00bdf14370dac1404068afe0..1a1a23a75708f6437653fa00a015108ecf3bcd0c 100644 (file)
@@ -1310,6 +1310,7 @@ static bool run_tcon_test(int dummy)
        const char *fname = "\\tcontest.tmp";
        uint16_t fnum1;
        uint32_t cnum1, cnum2, cnum3;
+       struct smbXcli_tcon *orig_tcon = NULL;
        uint16_t vuid1, vuid2;
        char buf[4];
        bool ret = True;
@@ -1341,6 +1342,11 @@ static bool run_tcon_test(int dummy)
                return False;
        }
 
+       orig_tcon = cli_state_save_tcon(cli);
+       if (orig_tcon == NULL) {
+               return false;
+       }
+
        status = cli_tree_connect(cli, share, "?????",
                                  password, strlen(password)+1);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1409,6 +1415,8 @@ static bool run_tcon_test(int dummy)
                return False;
        }
 
+       cli_state_restore_tcon(cli, orig_tcon);
+
        cli_state_set_tid(cli, cnum1);
 
        if (!torture_close_connection(cli)) {
@@ -8875,6 +8883,7 @@ static bool run_uid_regression_test(int dummy)
        int16_t old_vuid;
        int32_t old_cnum;
        bool correct = True;
+       struct smbXcli_tcon *orig_tcon = NULL;
        NTSTATUS status;
 
        printf("starting uid regression test\n");
@@ -8915,6 +8924,11 @@ static bool run_uid_regression_test(int dummy)
        }
 
        old_cnum = cli_state_get_tid(cli);
+       orig_tcon = cli_state_save_tcon(cli);
+       if (orig_tcon == NULL) {
+               correct = false;
+               goto out;
+       }
 
        /* Now try a SMBtdis with the invald vuid set to zero. */
        cli_state_set_uid(cli, 0);
@@ -8927,9 +8941,11 @@ static bool run_uid_regression_test(int dummy)
        } else {
                d_printf("First tdis failed (%s)\n", nt_errstr(status));
                correct = false;
+               cli_state_restore_tcon(cli, orig_tcon);
                goto out;
        }
 
+       cli_state_restore_tcon(cli, orig_tcon);
        cli_state_set_uid(cli, old_vuid);
        cli_state_set_tid(cli, old_cnum);
 
index 1e3e2866ae43ca4c50a95c8509631b0416ad0639..3ed376b8b5549fd6ca9480960d7850868f36fd76 100644 (file)
@@ -5101,7 +5101,7 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd,
        union srvsvc_NetShareInfo info;
        WERROR result;
        NTSTATUS status;
-       uint16_t cnum;
+       struct smbXcli_tcon *orig_tcon = NULL;
        struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
 
        status = dcerpc_srvsvc_NetShareGetInfo(b, mem_ctx,
@@ -5123,9 +5123,15 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd,
                          netname));
        }
 
-       cnum = cli_state_get_tid(cli);
+       if (cli_state_has_tcon(cli)) {
+               orig_tcon = cli_state_save_tcon(cli);
+               if (orig_tcon == NULL) {
+                       return;
+               }
+       }
 
        if (!NT_STATUS_IS_OK(cli_tree_connect(cli, netname, "A:", "", 0))) {
+               cli_state_restore_tcon(cli, orig_tcon);
                return;
        }
 
@@ -5168,7 +5174,7 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd,
        if (fnum != (uint16_t)-1)
                cli_close(cli, fnum);
        cli_tdis(cli);
-       cli_state_set_tid(cli, cnum);
+       cli_state_restore_tcon(cli, orig_tcon);
 
        return;
 }
index 5cb707d2d7d7c581fe24f5d48d95ea9074adb9c5..f4a0972e1df640b9052284c47e9b2d1cc7d27eae 100644 (file)
@@ -51,12 +51,20 @@ static NTSTATUS cli_lsa_lookup_domain_sid(struct cli_state *cli,
                                          struct dom_sid *sid)
 {
        union lsa_PolicyInformation *info = NULL;
-       uint16_t orig_cnum = cli_state_get_tid(cli);
+       struct smbXcli_tcon *orig_tcon = NULL;
        struct rpc_pipe_client *rpc_pipe = NULL;
        struct policy_handle handle;
        NTSTATUS status, result;
        TALLOC_CTX *frame = talloc_stackframe();
 
+       if (cli_state_has_tcon(cli)) {
+               orig_tcon = cli_state_save_tcon(cli);
+               if (orig_tcon == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto done;
+               }
+       }
+
        status = cli_tree_connect(cli, "IPC$", "?????", "", 0);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
@@ -88,7 +96,7 @@ tdis:
        TALLOC_FREE(rpc_pipe);
        cli_tdis(cli);
 done:
-       cli_state_set_tid(cli, orig_cnum);
+       cli_state_restore_tcon(cli, orig_tcon);
        TALLOC_FREE(frame);
        return status;
 }