diff options
author | Andreas Schneider <asn@samba.org> | 2011-05-25 17:26:01 +0200 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2011-06-01 12:02:15 +0200 |
commit | 438b24a77f5173d9ffee76009589033ece6e9dce (patch) | |
tree | c46d897575cb8873d71235fb053ccd0642b7dbe3 | |
parent | 7d800a8694e7c9bef96ae006ace5807872f375d4 (diff) | |
download | samba-438b24a77f5173d9ffee76009589033ece6e9dce.tar.gz samba-438b24a77f5173d9ffee76009589033ece6e9dce.tar.bz2 samba-438b24a77f5173d9ffee76009589033ece6e9dce.zip |
s3-rpc_server: Remove guessing of the syntax id.
This is only a wild guess. We don't know to which rpc service the client
wants to talk until we read the the rpc bind packet.
-rw-r--r-- | source3/rpc_server/epmd.c | 3 | ||||
-rw-r--r-- | source3/rpc_server/rpc_ep_setup.c | 10 | ||||
-rw-r--r-- | source3/rpc_server/rpc_server.c | 40 | ||||
-rw-r--r-- | source3/rpc_server/rpc_server.h | 2 | ||||
-rw-r--r-- | source3/rpc_server/srv_pipe.c | 7 |
5 files changed, 11 insertions, 51 deletions
diff --git a/source3/rpc_server/epmd.c b/source3/rpc_server/epmd.c index 4e2056e506..81ebc46a9d 100644 --- a/source3/rpc_server/epmd.c +++ b/source3/rpc_server/epmd.c @@ -54,7 +54,6 @@ static bool epmd_open_sockets(struct tevent_context *ev_ctx, port = setup_dcerpc_ncacn_tcpip_socket(ev_ctx, msg_ctx, - ndr_table_epmapper.syntax_id, ifss, 135); if (port == 0) { @@ -89,7 +88,6 @@ static bool epmd_open_sockets(struct tevent_context *ev_ctx, port = setup_dcerpc_ncacn_tcpip_socket(ev_ctx, msg_ctx, - ndr_table_epmapper.syntax_id, &ss, 135); if (port == 0) { @@ -263,7 +261,6 @@ void start_epmd(struct tevent_context *ev_ctx, ok = setup_dcerpc_ncalrpc_socket(ev_ctx, msg_ctx, - ndr_table_epmapper.syntax_id, "EPMAPPER", srv_epmapper_delete_endpoints); if (!ok) { diff --git a/source3/rpc_server/rpc_ep_setup.c b/source3/rpc_server/rpc_ep_setup.c index 918bcd43f7..3ed2f0dc9d 100644 --- a/source3/rpc_server/rpc_ep_setup.c +++ b/source3/rpc_server/rpc_ep_setup.c @@ -79,7 +79,6 @@ static uint16_t _open_sockets(struct tevent_context *ev_ctx, p = setup_dcerpc_ncacn_tcpip_socket(ev_ctx, msg_ctx, - syntax_id, ifss, port); if (p == 0) { @@ -115,7 +114,6 @@ static uint16_t _open_sockets(struct tevent_context *ev_ctx, p = setup_dcerpc_ncacn_tcpip_socket(ev_ctx, msg_ctx, - syntax_id, &ss, port); if (p == 0) { @@ -430,7 +428,6 @@ static bool winreg_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -478,7 +475,6 @@ static bool srvsvc_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -527,7 +523,6 @@ static bool lsarpc_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -576,7 +571,6 @@ static bool samr_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -625,7 +619,6 @@ static bool netlogon_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -890,7 +883,6 @@ static bool netdfs_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -939,7 +931,6 @@ static bool dssetup_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { @@ -987,7 +978,6 @@ static bool wkssvc_init_cb(void *ptr) ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx, ep_ctx->msg_ctx, - abstract_syntax, pipe_name, NULL); if (!ok) { diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 3f81a2ff38..064fba3b04 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -79,7 +79,6 @@ static NTSTATUS auth_anonymous_session_info(TALLOC_CTX *mem_ctx, * sent from the client */ static int make_server_pipes_struct(TALLOC_CTX *mem_ctx, const char *pipe_name, - const struct ndr_syntax_id id, enum dcerpc_transport_t transport, bool ncalrpc_as_system, const char *client_address, @@ -93,14 +92,14 @@ static int make_server_pipes_struct(TALLOC_CTX *mem_ctx, struct pipes_struct *p; struct auth_serversupplied_info *server_info; NTSTATUS status; - bool ok; p = talloc_zero(mem_ctx, struct pipes_struct); if (!p) { *perrno = ENOMEM; return -1; } - p->syntax = id; + + p->syntax = null_ndr_syntax_id; p->transport = transport; p->ncalrpc_as_system = ncalrpc_as_system; @@ -111,15 +110,6 @@ static int make_server_pipes_struct(TALLOC_CTX *mem_ctx, return -1; } - ok = init_pipe_handles(p, &id); - if (!ok) { - DEBUG(1, ("Failed to init handles\n")); - TALLOC_FREE(p); - *perrno = EINVAL; - return -1; - } - - data_blob_free(&p->in_data.data); data_blob_free(&p->in_data.pdu); @@ -354,7 +344,6 @@ static void named_pipe_listener(struct tevent_context *ev, struct named_pipe_client { const char *pipe_name; - struct ndr_syntax_id pipe_id; struct tevent_context *ev; struct messaging_context *msg_ctx; @@ -383,20 +372,11 @@ static void named_pipe_accept_done(struct tevent_req *subreq); static void named_pipe_accept_function(const char *pipe_name, int fd) { - struct ndr_syntax_id syntax; struct named_pipe_client *npc; struct tstream_context *plain; struct tevent_req *subreq; - bool ok; int ret; - ok = is_known_pipename(pipe_name, &syntax); - if (!ok) { - DEBUG(1, ("Unknown pipe [%s]\n", pipe_name)); - close(fd); - return; - } - npc = talloc_zero(NULL, struct named_pipe_client); if (!npc) { DEBUG(0, ("Out of memory!\n")); @@ -404,7 +384,6 @@ static void named_pipe_accept_function(const char *pipe_name, int fd) return; } npc->pipe_name = pipe_name; - npc->pipe_id = syntax; npc->ev = server_event_context(); npc->msg_ctx = server_messaging_context(); @@ -484,7 +463,7 @@ static void named_pipe_accept_done(struct tevent_req *subreq) } ret = make_server_pipes_struct(npc, - npc->pipe_name, npc->pipe_id, NCACN_NP, + npc->pipe_name, NCACN_NP, false, cli_addr, NULL, npc->session_info, &npc->p, &error); if (ret != 0) { @@ -693,7 +672,6 @@ fail: static void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - struct ndr_syntax_id syntax_id, enum dcerpc_transport_t transport, const char *name, uint16_t port, @@ -713,7 +691,6 @@ static void dcerpc_ncacn_tcpip_listener(struct tevent_context *ev, uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - struct ndr_syntax_id syntax_id, const struct sockaddr_storage *ifss, uint16_t port) { @@ -727,7 +704,6 @@ uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, return 0; } - state->syntax_id = syntax_id; state->fd = -1; state->ep.port = port; state->disconnect_fn = NULL; @@ -853,7 +829,6 @@ static void dcerpc_ncacn_tcpip_listener(struct tevent_context *ev, dcerpc_ncacn_accept(state->ev_ctx, state->msg_ctx, - state->syntax_id, NCACN_IP_TCP, NULL, state->ep.port, @@ -874,7 +849,6 @@ static void dcerpc_ncalrpc_listener(struct tevent_context *ev, bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - struct ndr_syntax_id syntax_id, const char *name, dcerpc_ncacn_disconnect_fn fn) { @@ -887,7 +861,6 @@ bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx, return false; } - state->syntax_id = syntax_id; state->fd = -1; state->disconnect_fn = fn; @@ -983,15 +956,13 @@ static void dcerpc_ncalrpc_listener(struct tevent_context *ev, dcerpc_ncacn_accept(state->ev_ctx, state->msg_ctx, - state->syntax_id, NCALRPC, + NCALRPC, state->ep.name, 0, cli_addr, NULL, sd, state->disconnect_fn); } struct dcerpc_ncacn_conn { - struct ndr_syntax_id syntax_id; - enum dcerpc_transport_t transport; union { @@ -1025,7 +996,6 @@ static void dcerpc_ncacn_packet_done(struct tevent_req *subreq); static void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - struct ndr_syntax_id syntax_id, enum dcerpc_transport_t transport, const char *name, uint16_t port, @@ -1054,7 +1024,6 @@ static void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, } ncacn_conn->transport = transport; - ncacn_conn->syntax_id = syntax_id; ncacn_conn->ev_ctx = ev_ctx; ncacn_conn->msg_ctx = msg_ctx; ncacn_conn->sock = s; @@ -1185,7 +1154,6 @@ static void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, rc = make_server_pipes_struct(ncacn_conn, pipe_name, - ncacn_conn->syntax_id, ncacn_conn->transport, system_user, cli_str, diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index 41d508c6dc..aafc96238a 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -31,13 +31,11 @@ bool setup_named_pipe_socket(const char *pipe_name, uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - struct ndr_syntax_id syntax_id, const struct sockaddr_storage *ifss, uint16_t port); bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - struct ndr_syntax_id syntax_id, const char *name, dcerpc_ncacn_disconnect_fn fn); diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index 6e48fedd2b..878f5d0792 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -335,6 +335,7 @@ static bool check_bind_req(struct pipes_struct *p, uint32_t context_id) { struct pipe_rpc_fns *context_fns; + bool ok; DEBUG(3,("check_bind_req for %s\n", get_pipe_name_from_syntax(talloc_tos(), abstract))); @@ -349,6 +350,12 @@ static bool check_bind_req(struct pipes_struct *p, return false; } + ok = init_pipe_handles(p, abstract); + if (!ok) { + DEBUG(1, ("Failed to init pipe handles!\n")); + return false; + } + context_fns = SMB_MALLOC_P(struct pipe_rpc_fns); if (context_fns == NULL) { DEBUG(0,("check_bind_req: malloc() failed!\n")); |