diff options
-rw-r--r-- | source4/build/pidl/util.pm | 1 | ||||
-rw-r--r-- | source4/librpc/idl/epmapper.idl | 3 | ||||
-rw-r--r-- | source4/librpc/idl/mgmt.idl | 1 | ||||
-rw-r--r-- | source4/librpc/idl/remact.idl | 2 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 61 |
5 files changed, 26 insertions, 42 deletions
diff --git a/source4/build/pidl/util.pm b/source4/build/pidl/util.pm index 03541ae95d..bddce57740 100644 --- a/source4/build/pidl/util.pm +++ b/source4/build/pidl/util.pm @@ -239,7 +239,6 @@ sub type_align($) return 4, if ($type eq "DATA_BLOB"); return 4, if ($type eq "int32"); - print STDERR "Had to guess align width for type $type\n"; # it must be an external type - all we can do is guess return 4; } diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl index 2bff814a45..e18c24a3cd 100644 --- a/source4/librpc/idl/epmapper.idl +++ b/source4/librpc/idl/epmapper.idl @@ -36,9 +36,6 @@ interface epmapper const string NDR_GUID = "8a885d04-1ceb-11c9-9fe8-08002b104860"; const string NDR_GUID_VERSION = 2; - const uint32 EPMAPPER_PORT = 135; - const string EPMAPPER_IDENTIFIER = "EPMAPPER"; - typedef struct { GUID uuid; uint16 version; diff --git a/source4/librpc/idl/mgmt.idl b/source4/librpc/idl/mgmt.idl index 8cc409454f..ac41ff1864 100644 --- a/source4/librpc/idl/mgmt.idl +++ b/source4/librpc/idl/mgmt.idl @@ -7,6 +7,7 @@ [ uuid("afa8bd80-7d8a-11c9-bef4-08002b102989"), version(1.0), + endpoint("ncalrpc:", "ncacn_ip_tcp:[135]", "ncacn_np:[\\pipe\\epmapper]"), helpstring("DCE/RPC Remote Management") ] interface mgmt diff --git a/source4/librpc/idl/remact.idl b/source4/librpc/idl/remact.idl index 8a77240a19..6065d41bcc 100644 --- a/source4/librpc/idl/remact.idl +++ b/source4/librpc/idl/remact.idl @@ -10,7 +10,7 @@ [ uuid("4d9f4ab8-7d1c-11cf-861e-0020af6e7c57"), pointer_default(unique), - endpoint("ncalrpc:", "ncacn_ip_tcp:[135]"), + endpoint("ncalrpc:", "ncacn_ip_tcp:[135]", "ncacn_np:[\\pipe\\epmapper]"), depends(dcom) ] interface IRemoteActivation diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 8eb058d7b3..3e460af8e7 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -24,9 +24,6 @@ #include "includes.h" #include "system/network.h" #include "librpc/gen_ndr/ndr_epmapper.h" -#include "librpc/gen_ndr/ndr_remact.h" -#include "librpc/gen_ndr/ndr_oxidresolver.h" -#include "librpc/gen_ndr/ndr_mgmt.h" #include "librpc/gen_ndr/tables.h" /* @@ -660,19 +657,25 @@ NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *bind struct GUID guid; struct epm_twr_t twr, *twr_r; struct dcerpc_binding epmapper_binding; + const struct dcerpc_interface_table *table = idl_iface_by_uuid(uuid); + int i; + + /* 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 (!strcmp(uuid, DCERPC_EPMAPPER_UUID) || - !strcmp(uuid, DCERPC_MGMT_UUID) || - !strcmp(uuid, DCERPC_IREMOTEACTIVATION_UUID) || - !strcmp(uuid, DCERPC_IOXIDRESOLVER_UUID)) { - switch(binding->transport) { - case NCACN_IP_TCP: binding->endpoint = talloc_asprintf(mem_ctx, "%d", EPMAPPER_PORT); return NT_STATUS_OK; - case NCALRPC: binding->endpoint = EPMAPPER_IDENTIFIER; return NT_STATUS_OK; - default: return NT_STATUS_NOT_SUPPORTED; + if (NT_STATUS_IS_OK(status) && default_binding.transport == binding->transport && default_binding.endpoint) { + binding->endpoint = talloc_strdup(mem_ctx, default_binding.endpoint); + return NT_STATUS_OK; + } } } - + ZERO_STRUCT(epmapper_binding); epmapper_binding.transport = binding->transport; @@ -759,36 +762,20 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, const char *pipe_name = NULL; TALLOC_CTX *mem_ctx = talloc_init("dcerpc_pipe_connect_ncacn_np"); + /* Look up identifier using the epmapper */ if (!binding->endpoint) { - const struct dcerpc_interface_table *table = idl_iface_by_uuid(pipe_uuid); - struct dcerpc_binding default_binding; - int i; - - if (!table) { - DEBUG(0,("Unknown interface endpoint '%s'\n", pipe_uuid)); + status = dcerpc_epm_map_binding(mem_ctx, binding, pipe_uuid, pipe_version); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("Failed to map DCERPC/TCP NCACN_NP pipe for '%s' - %s\n", + pipe_uuid, nt_errstr(status))); talloc_destroy(mem_ctx); - return NT_STATUS_INVALID_PARAMETER; - } - - /* 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) && default_binding.transport == NCACN_NP) { - pipe_name = default_binding.endpoint; - break; - - } - } - - if (pipe_name == NULL) { - DEBUG(0, ("No default named pipe specified for interface with UUID %s\n", pipe_uuid)); - return NT_STATUS_OBJECT_NAME_NOT_FOUND; + return status; } - } else { - pipe_name = binding->endpoint; + DEBUG(1,("Mapped to DCERPC/TCP pipe %s\n", binding->endpoint)); } + pipe_name = binding->endpoint; + if (!strncasecmp(pipe_name, "/pipe/", 6) || !strncasecmp(pipe_name, "\\pipe\\", 6)) { pipe_name+=6; |