From: Stefan Metzmacher Date: Fri, 7 Aug 2020 13:57:15 +0000 (+0200) Subject: s3:rpc_client: reverse rpccli_{is_connected,set_timeout}() and rpccli_bh_{is_connecte... X-Git-Tag: talloc-2.3.2~886 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=19ef9c40f14f91fcae6874d9f94540dd850e308b;p=thirdparty%2Fsamba.git s3:rpc_client: reverse rpccli_{is_connected,set_timeout}() and rpccli_bh_{is_connected,set_timeout}() 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 Reviewed-by: Ralph Boehme --- diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c index 8227ef0b0bd..074d01828ad 100644 --- a/source3/rpc_client/cli_pipe.c +++ b/source3/rpc_client/cli_pipe.c @@ -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,