summaryrefslogtreecommitdiff
path: root/source4/librpc
diff options
context:
space:
mode:
Diffstat (limited to 'source4/librpc')
-rw-r--r--source4/librpc/rpc/dcerpc_util.c116
1 files changed, 13 insertions, 103 deletions
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c
index 1a6d91ee2e..868e39bf17 100644
--- a/source4/librpc/rpc/dcerpc_util.c
+++ b/source4/librpc/rpc/dcerpc_util.c
@@ -24,6 +24,7 @@
*/
#include "includes.h"
+#include "lib/events/events.h"
#include "libcli/composite/composite.h"
#include "librpc/gen_ndr/ndr_epmapper.h"
#include "librpc/gen_ndr/ndr_dcerpc.h"
@@ -868,6 +869,14 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
c->state = COMPOSITE_STATE_IN_PROGRESS;
c->private_data = s;
c->event_ctx = ev;
+
+ /* Try to find event context in memory context in case passed
+ * event_context (argument) was NULL. If there's none, just
+ * create a new one.
+ */
+ if (c->event_ctx == NULL) {
+ c->event_ctx = event_context_find(mem_ctx);
+ }
s->binding = binding;
s->table = table;
@@ -910,7 +919,7 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
epmapper_binding->endpoint = NULL;
pipe_connect_req = dcerpc_pipe_connect_b_send(c, &s->pipe, epmapper_binding, &dcerpc_table_epmapper,
- anon_creds, ev);
+ anon_creds, c->event_ctx);
if (composite_nomem(pipe_connect_req, c)) return c;
composite_continue(c, pipe_connect_req, continue_epm_recv_binding, c);
@@ -927,112 +936,13 @@ NTSTATUS dcerpc_epm_map_binding_recv(struct composite_context *c)
}
-
NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *binding,
const struct dcerpc_interface_table *table, struct event_context *ev)
{
- struct dcerpc_pipe *p;
- NTSTATUS status;
- struct policy_handle handle;
- struct GUID guid;
- struct epm_Map r;
- struct epm_twr_t twr, *twr_r;
- struct dcerpc_binding *epmapper_binding;
- int i;
-
- struct cli_credentials *anon_creds
- = cli_credentials_init(mem_ctx);
- cli_credentials_set_conf(anon_creds);
- cli_credentials_set_anonymous(anon_creds);
-
- /* First, check if there is a default endpoint specified in the IDL */
-
- if (table) {
- struct dcerpc_binding *default_binding;
-
- /* Find one of the default pipes for this interface */
- for (i = 0; i < table->endpoints->count; i++) {
- status = dcerpc_parse_binding(mem_ctx, table->endpoints->names[i], &default_binding);
-
- if (NT_STATUS_IS_OK(status)) {
- if (default_binding->transport == binding->transport && default_binding->endpoint) {
- binding->endpoint = talloc_reference(binding, default_binding->endpoint);
- talloc_free(default_binding);
- return NT_STATUS_OK;
- } else {
- talloc_free(default_binding);
- }
- }
- }
- }
-
- epmapper_binding = talloc_zero(mem_ctx, struct dcerpc_binding);
- if (!epmapper_binding) {
- return NT_STATUS_NO_MEMORY;
- }
-
- epmapper_binding->transport = binding->transport;
- epmapper_binding->host = talloc_reference(epmapper_binding,
- binding->host);
- epmapper_binding->options = NULL;
- epmapper_binding->flags = 0;
- epmapper_binding->endpoint = NULL;
-
- status = dcerpc_pipe_connect_b(mem_ctx,
- &p,
- epmapper_binding,
- &dcerpc_table_epmapper,
- anon_creds, ev);
-
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- ZERO_STRUCT(handle);
- ZERO_STRUCT(guid);
-
- binding->object = table->uuid;
- binding->object_version = table->if_version;
-
- status = dcerpc_binding_build_tower(p, binding, &twr.tower);
- if (NT_STATUS_IS_ERR(status)) {
- return status;
- }
-
- /* with some nice pretty paper around it of course */
- r.in.object = &guid;
- r.in.map_tower = &twr;
- r.in.entry_handle = &handle;
- r.in.max_towers = 1;
- r.out.entry_handle = &handle;
-
- status = dcerpc_epm_Map(p, p, &r);
- if (!NT_STATUS_IS_OK(status)) {
- talloc_free(p);
- return status;
- }
- if (r.out.result != 0 || r.out.num_towers != 1) {
- talloc_free(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- twr_r = r.out.towers[0].twr;
- if (!twr_r) {
- talloc_free(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- if (twr_r->tower.num_floors != twr.tower.num_floors ||
- twr_r->tower.floors[3].lhs.protocol != twr.tower.floors[3].lhs.protocol) {
- talloc_free(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- binding->endpoint = talloc_reference(binding, dcerpc_floor_get_rhs_data(mem_ctx, &twr_r->tower.floors[3]));
-
- talloc_free(p);
+ struct composite_context *c;
- return NT_STATUS_OK;
+ c = dcerpc_epm_map_binding_send(mem_ctx, binding, table, ev);
+ return dcerpc_epm_map_binding_recv(c);
}