diff options
-rw-r--r-- | source4/build/pidl/parser.pm | 16 | ||||
-rw-r--r-- | source4/librpc/idl/drsuapi.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/echo.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/epmapper.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/lsa.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/lsads.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/netlogon.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/oxidresolver.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/samr.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/spoolss.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/w32time.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/winreg.idl | 2 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_smb.c | 11 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 37 | ||||
-rw-r--r-- | source4/ntvfs/ipc/vfs_ipc.c | 5 | ||||
-rw-r--r-- | source4/rpc_server/dcerpc_server.c | 36 | ||||
-rw-r--r-- | source4/rpc_server/epmapper/rpc_epmapper.c | 3 |
17 files changed, 76 insertions, 54 deletions
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm index 7d7ee7a163..15dd1cd70e 100644 --- a/source4/build/pidl/parser.pm +++ b/source4/build/pidl/parser.pm @@ -1482,20 +1482,18 @@ sub FunctionTable($) } pidl "\t{ NULL, 0, NULL, NULL }\n};\n\n"; - my $endpoints; - - if (! defined $interface->{PROPERTIES}->{endpoints}) { - $interface->{PROPERTIES}->{endpoints} = $interface->{NAME}; + # If no endpoint is set, default to the interface name as a named pipe + if (! defined $interface->{PROPERTIES}->{endpoint}) { + $interface->{PROPERTIES}->{endpoint} = "\"ncacn_np:[\\\\pipe\\\\" . $interface->{NAME} . "]\""; } - my @e = split / /, $interface->{PROPERTIES}->{endpoints}; + my @e = split / /, $interface->{PROPERTIES}->{endpoint}; my $endpoint_count = $#e + 1; - pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {\n\t"; - for (my $i=0; $i < $#e; $i++) { - pidl "\"$e[$i]\", "; + pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {\n"; + foreach my $ep (@e) { + pidl "\t$ep, \n"; } - pidl "\"$e[$#e]\"\n"; pidl "};\n\n"; pidl "static const struct dcerpc_endpoint_list $interface->{NAME}\_endpoints = {\n"; diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl index a59dec5a29..15ebb6077d 100644 --- a/source4/librpc/idl/drsuapi.idl +++ b/source4/librpc/idl/drsuapi.idl @@ -3,7 +3,7 @@ [ uuid(e3514235-4b06-11d1-ab04-00c04fc2dcd2), version(4.0), - endpoints(lsass,protected_storage,TCP-0), + endpoint("ncacn_np:[\\pipe\\lsass]","ncacn_np:[\\pipe\\protected_storage]","ncacn_ip_tcp:"), helpstring("Active Directory Replication"), pointer_default(unique) ] diff --git a/source4/librpc/idl/echo.idl b/source4/librpc/idl/echo.idl index f8cc734513..e54b3914f8 100644 --- a/source4/librpc/idl/echo.idl +++ b/source4/librpc/idl/echo.idl @@ -3,7 +3,7 @@ [ uuid(60a15ec5-4de8-11d7-a637-005056a20182), - endpoints(rpcecho, TCP-0), + endpoint("ncacn_np:[\\pipe\\rpcecho]", "ncacn_ip_tcp:"), version(1.0), helpstring("Simple echo pipe") ] diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl index 18bb6bf7d7..eaf2b185f6 100644 --- a/source4/librpc/idl/epmapper.idl +++ b/source4/librpc/idl/epmapper.idl @@ -11,7 +11,7 @@ http://www.opengroup.org/onlinepubs/9629399/chap6.htm#tagcjh_11_02_03_01: bindin [ uuid(e1af8308-5d1f-11c9-91a4-08002b14a0fa), version(3.0), - endpoints(epmapper, TCP-135), + endpoint("ncacn_np:[\\pipe\\epmapper]", "ncacn_ip_tcp:[135]"), pointer_default(unique) ] interface epmapper diff --git a/source4/librpc/idl/lsa.idl b/source4/librpc/idl/lsa.idl index fe3aa1d51b..ca1090545a 100644 --- a/source4/librpc/idl/lsa.idl +++ b/source4/librpc/idl/lsa.idl @@ -6,7 +6,7 @@ [ uuid(12345778-1234-abcd-ef00-0123456789ab), version(0.0), - endpoints(lsarpc,lsass,TCP-0), + endpoint("ncacn_np:[\\pipe\\lsarpc]","ncacn_np:[\\pipe\\lsass]","ncacn_ip_tcp:"), pointer_default(unique), helpstring("Local Server Authentication(?)") ] interface lsarpc diff --git a/source4/librpc/idl/lsads.idl b/source4/librpc/idl/lsads.idl index 53ff69d687..3caed0f92f 100644 --- a/source4/librpc/idl/lsads.idl +++ b/source4/librpc/idl/lsads.idl @@ -3,7 +3,7 @@ [ uuid(3919286a-b10c-11d0-9ba8-00c04fd92ef5), version(0.0), - endpoints(lsarpc,lsass), + endpoint("ncacn_np:[\\pipe\\lsarpc]","ncacn_np:[\\pipe\\lsass]"), pointer_default(unique) ] interface lsads diff --git a/source4/librpc/idl/netlogon.idl b/source4/librpc/idl/netlogon.idl index d52fd2e757..9e0c3c4576 100644 --- a/source4/librpc/idl/netlogon.idl +++ b/source4/librpc/idl/netlogon.idl @@ -9,7 +9,7 @@ [ uuid(12345678-1234-abcd-ef00-01234567cffb), version(1.0), - endpoints(netlogon,TCP-0), + endpoint("ncacn_np:[\\pipe\\netlogon]","ncacn_ip_tcp:"), pointer_default(unique) ] diff --git a/source4/librpc/idl/oxidresolver.idl b/source4/librpc/idl/oxidresolver.idl index 1ef20e5bf0..6354e7b380 100644 --- a/source4/librpc/idl/oxidresolver.idl +++ b/source4/librpc/idl/oxidresolver.idl @@ -15,7 +15,7 @@ [ uuid(99fcfec4-5260-101b-bbcb-00aa0021347a), helpstring("Object Exporter ID Resolver"), - endpoints(epmapper, TCP-135), + endpoint("ncacn_np:[\\pipe\\epmapper]", "ncacn_ip_tcp:[135]"), pointer_default(unique) ] interface IOXIDResolver diff --git a/source4/librpc/idl/samr.idl b/source4/librpc/idl/samr.idl index 8feb726ac8..42a549cc5c 100644 --- a/source4/librpc/idl/samr.idl +++ b/source4/librpc/idl/samr.idl @@ -10,7 +10,7 @@ [ uuid(12345778-1234-abcd-ef00-0123456789ac), version(1.0), - endpoints(samr,TCP-0), + endpoint("ncacn_np:[\\pipe\\samr]","ncacn_ip_tcp:"), pointer_default(unique) ] interface samr { diff --git a/source4/librpc/idl/spoolss.idl b/source4/librpc/idl/spoolss.idl index 4ee9eab90c..be6dae084a 100644 --- a/source4/librpc/idl/spoolss.idl +++ b/source4/librpc/idl/spoolss.idl @@ -6,7 +6,7 @@ [ uuid(12345678-1234-abcd-ef00-0123456789ab), version(1.0), - endpoints(spoolss), + endpoint("ncacn_np:[\\pipe\\spoolss]"), pointer_default(unique), helpstring("Spooler SubSystem") ] interface spoolss diff --git a/source4/librpc/idl/w32time.idl b/source4/librpc/idl/w32time.idl index 568f97ef1d..3ba1bc1ed1 100644 --- a/source4/librpc/idl/w32time.idl +++ b/source4/librpc/idl/w32time.idl @@ -4,7 +4,7 @@ [ uuid(8fb6d884-2388-11d0-8c35-00c04fda2795), - endpoints(srvsvc,atsvc,browser,keysvc,wkssvc), + endpoint("ncacn_np:[\\pipe\\srvsvc]","ncacn_np:[\\pipe\\atsvc]","ncacn_np:[\\pipe\\browser]","ncacn_np:[\\pipe\\keysvc]","ncacn_np:[\\pipe\\wkssvc]"), version(4.1), helpstring("Win32 Time Server") ] diff --git a/source4/librpc/idl/winreg.idl b/source4/librpc/idl/winreg.idl index 428345ff30..1f7123f7f3 100644 --- a/source4/librpc/idl/winreg.idl +++ b/source4/librpc/idl/winreg.idl @@ -6,7 +6,7 @@ [ uuid(338cd001-2244-31f1-aaaa-900038001003), version(1.0), - endpoints(winreg,TCP-0), + endpoint("ncacn_np:[\\pipe\\winreg]","ncacn_ip_tcp:"), pointer_default(unique), helpstring("Remote Registry Service") ] interface winreg diff --git a/source4/librpc/rpc/dcerpc_smb.c b/source4/librpc/rpc/dcerpc_smb.c index ffe7e55a85..cfb02680e2 100644 --- a/source4/librpc/rpc/dcerpc_smb.c +++ b/source4/librpc/rpc/dcerpc_smb.c @@ -372,14 +372,8 @@ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe **p, { struct smb_private *smb; NTSTATUS status; - char *name; union smb_open io; - name = talloc_asprintf(tree, "\\%s", pipe_name); - if (!name) { - return NT_STATUS_NO_MEMORY; - } - io.ntcreatex.level = RAW_OPEN_NTCREATEX; io.ntcreatex.in.flags = 0; io.ntcreatex.in.root_fid = 0; @@ -398,10 +392,9 @@ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe **p, io.ntcreatex.in.create_options = 0; io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION; io.ntcreatex.in.security_flags = 0; - io.ntcreatex.in.fname = name; + io.ntcreatex.in.fname = pipe_name; - status = smb_raw_open(tree, name, &io); - talloc_free(name); + status = smb_raw_open(tree, pipe_name, &io); if (!NT_STATUS_IS_OK(status)) { return status; diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 747f8d1277..a82f30f3e5 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -4,6 +4,7 @@ dcerpc utility functions Copyright (C) Andrew Tridgell 2003 + Copyright (C) Jelmer Vernooij 2004 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -129,7 +130,6 @@ NTSTATUS dcerpc_epm_map_tcp_port(const char *server, return NT_STATUS_OK; } - /* find the pipe name for a local IDL interface */ @@ -425,24 +425,39 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, BOOL retry; struct smbcli_state *cli; const char *pipe_name; + TALLOC_CTX *mem_ctx = talloc_init("dcerpc_pipe_connect_ncacn_np"); if (!binding->options || !binding->options[0] || !strlen(binding->options[0])) { 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)); + talloc_destroy(mem_ctx); return NT_STATUS_INVALID_PARAMETER; } - /* only try the first endpoint for now */ - pipe_name = table->endpoints->names[0]; + + /* 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 == ENDPOINT_SMB) { + pipe_name = default_binding.options[0]; + break; + + } + } } else { pipe_name = binding->options[0]; } - if (strncasecmp(pipe_name, "\\pipe\\", 6) == 0) { - pipe_name += 6; + if (!strncasecmp(pipe_name, "/pipe/", 6)) { + pipe_name+=6; } - if (strncasecmp(pipe_name, "/pipe/", 6) == 0) { - pipe_name += 6; + + if (strncasecmp(pipe_name, "\\pipe\\", 6)) { + pipe_name = talloc_asprintf(mem_ctx, "\\pipe\\%s", pipe_name); } if (!username || !username[0]) { @@ -459,6 +474,7 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, } if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to connect to %s - %s\n", binding->host, nt_errstr(status))); + talloc_destroy(mem_ctx); return status; } @@ -467,8 +483,11 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, DEBUG(0,("Failed to open pipe %s - %s\n", pipe_name, nt_errstr(status))); smbcli_tdis(cli); smbcli_shutdown(cli); - return status; - } + talloc_destroy(mem_ctx); + return status; + } + + talloc_destroy(mem_ctx); /* this ensures that the reference count is decremented so a pipe close will really close the link */ diff --git a/source4/ntvfs/ipc/vfs_ipc.c b/source4/ntvfs/ipc/vfs_ipc.c index b37b3e917d..8c32a78512 100644 --- a/source4/ntvfs/ipc/vfs_ipc.c +++ b/source4/ntvfs/ipc/vfs_ipc.c @@ -227,9 +227,6 @@ static NTSTATUS ipc_open_generic(struct ntvfs_module_context *ntvfs, return NT_STATUS_TOO_MANY_OPENED_FILES; } - while (p->pipe_name[0] == '\\') { - p->pipe_name++; - } p->ipc_state = 0x5ff; /* @@ -310,8 +307,6 @@ static NTSTATUS ipc_open_openx(struct ntvfs_module_context *ntvfs, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } - fname += 4; - status = ipc_open_generic(ntvfs, req, fname, &p); if (!NT_STATUS_IS_OK(status)) { return status; diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index 220c730790..b4cf7094aa 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -153,17 +153,30 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, struct dcesrv_ep_description ep_description; struct dcesrv_endpoint *ep; struct dcesrv_if_list *ifl; - BOOL tcp; + struct dcerpc_binding binding; BOOL add_ep = False; + NTSTATUS status; + + status = dcerpc_parse_binding(dce_ctx, ep_name, &binding); - tcp = (strncasecmp(ep_name, "TCP-", 4) == 0); + if (NT_STATUS_IS_ERR(status)) { + DEBUG(0, ("Trouble parsing binding string '%s'\n", ep_name)); + return status; + } - if (tcp) { + if (binding.transport == NCACN_IP_TCP) { ep_description.type = ENDPOINT_TCP; - ep_description.info.tcp_port = atoi(ep_name+4); - } else { + ep_description.info.tcp_port = 0; + + if (binding.options && binding.options[0]) { + ep_description.info.tcp_port = atoi(binding.options[0]); + } + } else if (binding.transport == NCACN_NP) { ep_description.type = ENDPOINT_SMB; - ep_description.info.smb_pipe = ep_name; + ep_description.info.smb_pipe = binding.options[0]; + } else { + DEBUG(0, ("Unknown transport type '%d'\n", binding.transport)); + return NT_STATUS_INVALID_PARAMETER; } /* check if this endpoint exists @@ -174,12 +187,16 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx, return NT_STATUS_NO_MEMORY; } ZERO_STRUCTP(ep); - if (tcp) { + if (binding.transport == NCACN_IP_TCP) { ep->ep_description.type = ENDPOINT_TCP; - ep->ep_description.info.tcp_port = atoi(ep_name+4); + ep->ep_description.info.tcp_port = 0; + + if (binding.options && binding.options[0]) { + ep->ep_description.info.tcp_port = atoi(binding.options[0]); + } } else { ep->ep_description.type = ENDPOINT_SMB; - ep->ep_description.info.smb_pipe = smb_xstrdup(ep_name); + ep->ep_description.info.smb_pipe = binding.options[0]; } add_ep = True; } @@ -508,6 +525,7 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call) pkt.u.bind_ack.max_recv_frag = 0x2000; pkt.u.bind_ack.assoc_group_id = call->pkt.u.bind.assoc_group_id; if (call->conn->iface && call->conn->iface->ndr) { + /* FIXME: Use pipe name as specified by endpoint instead of interface name */ pkt.u.bind_ack.secondary_address = talloc_asprintf(call, "\\PIPE\\%s", call->conn->iface->ndr->name); } else { diff --git a/source4/rpc_server/epmapper/rpc_epmapper.c b/source4/rpc_server/epmapper/rpc_epmapper.c index 5cf34efa7f..7de99687b7 100644 --- a/source4/rpc_server/epmapper/rpc_epmapper.c +++ b/source4/rpc_server/epmapper/rpc_epmapper.c @@ -81,8 +81,7 @@ static BOOL fill_protocol_tower(TALLOC_CTX *mem_ctx, struct epm_towers *twr, /* on a SMB pipe ... */ twr->floors[3].lhs.protocol = EPM_PROTOCOL_SMB; twr->floors[3].lhs.info.lhs_data = data_blob(NULL, 0); - twr->floors[3].rhs.smb.unc = talloc_asprintf(mem_ctx, "\\PIPE\\%s", - e->ep_description.info.smb_pipe); + twr->floors[3].rhs.smb.unc = talloc_strdup(mem_ctx, e->ep_description.info.smb_pipe); /* on an NetBIOS link ... */ twr->floors[4].lhs.protocol = EPM_PROTOCOL_NETBIOS; |