From 6fe266f8d42c9634d0c87a8f56357e5cd2804ae9 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 25 Apr 2008 16:33:54 +0200 Subject: [PATCH] Revert "Remove the pipe_idx variable from rpc_pipe_client" This reverts commit 4840febcd481563c3d9b2fabc1fe1b2ae5a76cf6. --- source/include/client.h | 4 +- source/include/rpc_client.h | 2 +- source/lib/netapi/cm.c | 2 +- source/libsmb/libsmb_xattr.c | 2 +- source/rpc_client/cli_netlogon.c | 2 +- source/rpc_client/cli_pipe.c | 73 ++++++++++++++++++++------------ source/rpc_client/ndr.c | 2 +- source/rpc_parse/parse_rpc.c | 3 +- 8 files changed, 52 insertions(+), 38 deletions(-) diff --git a/source/include/client.h b/source/include/client.h index d9f4727203c..af03e2bb608 100644 --- a/source/include/client.h +++ b/source/include/client.h @@ -62,12 +62,10 @@ struct rpc_pipe_client { struct cli_state *cli; + int pipe_idx; const char *pipe_name; uint16 fnum; - const struct ndr_syntax_id *abstract_syntax; - const struct ndr_syntax_id *transfer_syntax; - const char *desthost; const char *srv_name_slash; diff --git a/source/include/rpc_client.h b/source/include/rpc_client.h index ce0c9329818..c552271ee76 100644 --- a/source/include/rpc_client.h +++ b/source/include/rpc_client.h @@ -91,7 +91,7 @@ #define CLI_DO_RPC_WERR( pcli, ctx, p_idx, opnum, q_in, r_out, \ q_ps, r_ps, q_io_fn, r_io_fn, default_error ) \ {\ - SMB_ASSERT(rpccli_is_pipe_idx(pcli, p_idx)); \ + SMB_ASSERT(pcli->pipe_idx == p_idx); \ if (!prs_init( &q_ps, RPC_MAX_PDU_FRAG_LEN, ctx, MARSHALL )) { \ return WERR_NOMEM;\ }\ diff --git a/source/lib/netapi/cm.c b/source/lib/netapi/cm.c index 2e16b98ffba..54642372479 100644 --- a/source/lib/netapi/cm.c +++ b/source/lib/netapi/cm.c @@ -105,7 +105,7 @@ static struct rpc_pipe_client *pipe_cm_find(struct cli_state *cli, } if (strequal(cli->desthost, p->pipe->desthost) && - rpccli_is_pipe_idx(p->pipe, pipe_idx)) { + pipe_idx == p->pipe->pipe_idx) { *status = NT_STATUS_OK; return p->pipe; } diff --git a/source/libsmb/libsmb_xattr.c b/source/libsmb/libsmb_xattr.c index 8763205d1fa..e17146e611c 100644 --- a/source/libsmb/libsmb_xattr.c +++ b/source/libsmb/libsmb_xattr.c @@ -39,7 +39,7 @@ find_lsa_pipe_hnd(struct cli_state *ipc_cli) pipe_hnd; pipe_hnd = pipe_hnd->next) { - if (rpccli_is_pipe_idx(pipe_hnd, PI_LSARPC)) { + if (pipe_hnd->pipe_idx == PI_LSARPC) { return pipe_hnd; } } diff --git a/source/rpc_client/cli_netlogon.c b/source/rpc_client/cli_netlogon.c index cb1d93e9c11..bf1e161957a 100644 --- a/source/rpc_client/cli_netlogon.c +++ b/source/rpc_client/cli_netlogon.c @@ -134,7 +134,7 @@ NTSTATUS rpccli_netlogon_setup_creds(struct rpc_pipe_client *cli, struct dcinfo *dc; bool retried = false; - SMB_ASSERT(rpccli_is_pipe_idx(cli, PI_NETLOGON)); + SMB_ASSERT(cli->pipe_idx == PI_NETLOGON); dc = cli->dc; if (!dc) { diff --git a/source/rpc_client/cli_pipe.c b/source/rpc_client/cli_pipe.c index 2979d168c5d..b9d184f023a 100644 --- a/source/rpc_client/cli_pipe.c +++ b/source/rpc_client/cli_pipe.c @@ -1092,8 +1092,8 @@ static NTSTATUS create_schannel_auth_rpc_bind_req( struct rpc_pipe_client *cli, static NTSTATUS create_bind_or_alt_ctx_internal(enum RPC_PKT_TYPE pkt_type, prs_struct *rpc_out, uint32 rpc_call_id, - const RPC_IFACE *abstract, - const RPC_IFACE *transfer, + RPC_IFACE *abstract, + RPC_IFACE *transfer, RPC_HDR_AUTH *phdr_auth, prs_struct *pauth_info) { @@ -1174,8 +1174,7 @@ static NTSTATUS create_bind_or_alt_ctx_internal(enum RPC_PKT_TYPE pkt_type, static NTSTATUS create_rpc_bind_req(struct rpc_pipe_client *cli, prs_struct *rpc_out, uint32 rpc_call_id, - const RPC_IFACE *abstract, - const RPC_IFACE *transfer, + RPC_IFACE *abstract, RPC_IFACE *transfer, enum pipe_auth_type auth_type, enum pipe_auth_level auth_level) { @@ -1640,7 +1639,34 @@ static bool rpc_pipe_set_hnd_state(struct rpc_pipe_client *cli, Check the rpc bind acknowledge response. ****************************************************************************/ -static bool check_bind_response(RPC_HDR_BA *hdr_ba, const RPC_IFACE *transfer) +static bool valid_pipe_name(const int pipe_idx, RPC_IFACE *abstract, RPC_IFACE *transfer) +{ + if ( pipe_idx >= PI_MAX_PIPES ) { + DEBUG(0,("valid_pipe_name: Programmer error! Invalid pipe index [%d]\n", + pipe_idx)); + return False; + } + + DEBUG(5,("Bind Abstract Syntax: ")); + dump_data(5, (uint8 *)&pipe_names[pipe_idx].abstr_syntax, + sizeof(pipe_names[pipe_idx].abstr_syntax)); + DEBUG(5,("Bind Transfer Syntax: ")); + dump_data(5, (uint8 *)&pipe_names[pipe_idx].trans_syntax, + sizeof(pipe_names[pipe_idx].trans_syntax)); + + /* copy the required syntaxes out so we can do the right bind */ + + *transfer = *pipe_names[pipe_idx].trans_syntax; + *abstract = *pipe_names[pipe_idx].abstr_syntax; + + return True; +} + +/**************************************************************************** + Check the rpc bind acknowledge response. +****************************************************************************/ + +static bool check_bind_response(RPC_HDR_BA *hdr_ba, const int pipe_idx, RPC_IFACE *transfer) { if ( hdr_ba->addr.len == 0) { DEBUG(4,("Ignoring length check -- ASU bug (server didn't fill in the pipe name correctly)")); @@ -1813,8 +1839,8 @@ static NTSTATUS rpc_finish_auth3_bind(struct rpc_pipe_client *cli, ********************************************************************/ static NTSTATUS create_rpc_alter_context(uint32 rpc_call_id, - const RPC_IFACE *abstract, - const RPC_IFACE *transfer, + RPC_IFACE *abstract, + RPC_IFACE *transfer, enum pipe_auth_level auth_level, const DATA_BLOB *pauth_blob, /* spnego auth blob already created. */ prs_struct *rpc_out) @@ -1857,8 +1883,8 @@ static NTSTATUS rpc_finish_spnego_ntlmssp_bind(struct rpc_pipe_client *cli, RPC_HDR *phdr, prs_struct *rbuf, uint32 rpc_call_id, - const RPC_IFACE *abstract, - const RPC_IFACE *transfer, + RPC_IFACE *abstract, + RPC_IFACE *transfer, enum pipe_auth_type auth_type, enum pipe_auth_level auth_level) { @@ -1992,6 +2018,8 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, { RPC_HDR hdr; RPC_HDR_BA hdr_ba; + RPC_IFACE abstract; + RPC_IFACE transfer; prs_struct rpc_out; prs_struct rbuf; uint32 rpc_call_id; @@ -2003,14 +2031,17 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, (unsigned int)auth_type, (unsigned int)auth_level )); + if (!valid_pipe_name(cli->pipe_idx, &abstract, &transfer)) { + return NT_STATUS_INVALID_PARAMETER; + } + prs_init_empty(&rpc_out, talloc_tos(), MARSHALL); rpc_call_id = get_rpc_call_id(); /* Marshall the outgoing data. */ status = create_rpc_bind_req(cli, &rpc_out, rpc_call_id, - cli->abstract_syntax, - cli->transfer_syntax, + &abstract, &transfer, auth_type, auth_level); @@ -2050,7 +2081,7 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, return NT_STATUS_BUFFER_TOO_SMALL; } - if(!check_bind_response(&hdr_ba, cli->transfer_syntax)) { + if(!check_bind_response(&hdr_ba, cli->pipe_idx, &transfer)) { DEBUG(2,("rpc_pipe_bind: check_bind_response failed.\n")); prs_mem_free(&rbuf); return NT_STATUS_BUFFER_TOO_SMALL; @@ -2080,8 +2111,7 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, case PIPE_AUTH_TYPE_SPNEGO_NTLMSSP: /* Need to send alter context request and reply. */ status = rpc_finish_spnego_ntlmssp_bind(cli, &hdr, &rbuf, rpc_call_id, - cli->abstract_syntax, - cli->transfer_syntax, + &abstract, &transfer, auth_type, auth_level); if (!NT_STATUS_IS_OK(status)) { prs_mem_free(&rbuf); @@ -2132,11 +2162,6 @@ unsigned int rpccli_set_timeout(struct rpc_pipe_client *cli, return cli_set_timeout(cli->cli, timeout); } -bool rpccli_is_pipe_idx(struct rpc_pipe_client *cli, int pipe_idx) -{ - return (cli->abstract_syntax == pipe_names[pipe_idx].abstr_syntax); -} - /**************************************************************************** Open a named pipe over SMB to a remote server. * @@ -2164,13 +2189,6 @@ static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe return NULL; } - if ( pipe_idx >= PI_MAX_PIPES ) { - DEBUG(0, ("cli_rpc_pipe_open: Programmer error! Invalid pipe " - "index [%d]\n", pipe_idx)); - *perr = NT_STATUS_INVALID_PARAMETER; - return NULL; - } - /* The pipe name index must fall within our array */ SMB_ASSERT((pipe_idx >= 0) && (pipe_idx < PI_MAX_PIPES)); @@ -2195,8 +2213,7 @@ static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe result->fnum = fnum; result->cli = cli; - result->abstract_syntax = pipe_names[pipe_idx].abstr_syntax; - result->transfer_syntax = pipe_names[pipe_idx].trans_syntax; + result->pipe_idx = pipe_idx; result->auth.auth_type = PIPE_AUTH_TYPE_NONE; result->auth.auth_level = PIPE_AUTH_LEVEL_NONE; diff --git a/source/rpc_client/ndr.c b/source/rpc_client/ndr.c index 91751a2d712..ae705b313b5 100644 --- a/source/rpc_client/ndr.c +++ b/source/rpc_client/ndr.c @@ -35,7 +35,7 @@ NTSTATUS cli_do_rpc_ndr(struct rpc_pipe_client *cli, NTSTATUS status; enum ndr_err_code ndr_err; - SMB_ASSERT(rpccli_is_pipe_idx(cli, p_idx)); + SMB_ASSERT(cli->pipe_idx == p_idx); SMB_ASSERT(table->num_calls > opnum); call = &table->calls[opnum]; diff --git a/source/rpc_parse/parse_rpc.c b/source/rpc_parse/parse_rpc.c index d0be83bd4eb..3f897211545 100644 --- a/source/rpc_parse/parse_rpc.c +++ b/source/rpc_parse/parse_rpc.c @@ -252,8 +252,7 @@ static bool smb_io_rpc_hdr_bba(const char *desc, RPC_HDR_BBA *rpc, prs_struct * Note the transfer pointer must remain valid until this is marshalled. ********************************************************************/ -void init_rpc_context(RPC_CONTEXT *rpc_ctx, uint16 context_id, - const RPC_IFACE *abstract, const RPC_IFACE *transfer) +void init_rpc_context(RPC_CONTEXT *rpc_ctx, uint16 context_id, RPC_IFACE *abstract, RPC_IFACE *transfer) { rpc_ctx->context_id = context_id ; /* presentation context identifier (0x0) */ rpc_ctx->num_transfer_syntaxes = 1 ; /* the number of syntaxes (has always been 1?)(0x1) */ -- 2.47.3