]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:rpc_client: reverse rpccli_{is_connected,set_timeout}() and rpccli_bh_{is_connecte...
authorStefan Metzmacher <metze@samba.org>
Fri, 7 Aug 2020 13:57:15 +0000 (15:57 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 8 Aug 2020 09:36:28 +0000 (09:36 +0000)
rpccli->transport should never be used directly,
everything should go via the binding handle.

Internal pipes don't have a transport, so p->transport is always
NULL. rpccli_is_connected() checks this and this causes all SAMR and LSA
requests for the local domain to be processed a second time by the triggered
retry logic.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14457

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/rpc_client/cli_pipe.c

index 8227ef0b0bd1394c6b3d69c781776c53783f5349..074d01828adf44b8ce18887653d13e1ba39b213e 100644 (file)
@@ -2158,22 +2158,16 @@ NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli,
 unsigned int rpccli_set_timeout(struct rpc_pipe_client *rpc_cli,
                                unsigned int timeout)
 {
-       unsigned int old;
-
-       if (rpc_cli->transport == NULL) {
-               return RPCCLI_DEFAULT_TIMEOUT;
-       }
-
-       if (rpc_cli->transport->set_timeout == NULL) {
+       if (rpc_cli == NULL) {
                return RPCCLI_DEFAULT_TIMEOUT;
        }
 
-       old = rpc_cli->transport->set_timeout(rpc_cli->transport->priv, timeout);
-       if (old == 0) {
+       if (rpc_cli->binding_handle == NULL) {
                return RPCCLI_DEFAULT_TIMEOUT;
        }
 
-       return old;
+       return dcerpc_binding_handle_set_timeout(rpc_cli->binding_handle,
+                                                timeout);
 }
 
 bool rpccli_is_connected(struct rpc_pipe_client *rpc_cli)
@@ -2182,11 +2176,11 @@ bool rpccli_is_connected(struct rpc_pipe_client *rpc_cli)
                return false;
        }
 
-       if (rpc_cli->transport == NULL) {
+       if (rpc_cli->binding_handle == NULL) {
                return false;
        }
 
-       return rpc_cli->transport->is_connected(rpc_cli->transport->priv);
+       return dcerpc_binding_handle_is_connected(rpc_cli->binding_handle);
 }
 
 struct rpccli_bh_state {
@@ -2197,8 +2191,17 @@ static bool rpccli_bh_is_connected(struct dcerpc_binding_handle *h)
 {
        struct rpccli_bh_state *hs = dcerpc_binding_handle_data(h,
                                     struct rpccli_bh_state);
+       struct rpc_cli_transport *transport = hs->rpc_cli->transport;
+
+       if (transport == NULL) {
+               return false;
+       }
+
+       if (transport->is_connected == NULL) {
+               return false;
+       }
 
-       return rpccli_is_connected(hs->rpc_cli);
+       return transport->is_connected(transport->priv);
 }
 
 static uint32_t rpccli_bh_set_timeout(struct dcerpc_binding_handle *h,
@@ -2206,8 +2209,23 @@ static uint32_t rpccli_bh_set_timeout(struct dcerpc_binding_handle *h,
 {
        struct rpccli_bh_state *hs = dcerpc_binding_handle_data(h,
                                     struct rpccli_bh_state);
+       struct rpc_cli_transport *transport = hs->rpc_cli->transport;
+       unsigned int old;
 
-       return rpccli_set_timeout(hs->rpc_cli, timeout);
+       if (transport == NULL) {
+               return RPCCLI_DEFAULT_TIMEOUT;
+       }
+
+       if (transport->set_timeout == NULL) {
+               return RPCCLI_DEFAULT_TIMEOUT;
+       }
+
+       old = transport->set_timeout(transport->priv, timeout);
+       if (old == 0) {
+               return RPCCLI_DEFAULT_TIMEOUT;
+       }
+
+       return old;
 }
 
 static void rpccli_bh_auth_info(struct dcerpc_binding_handle *h,