r24763: Allow users to leave out the transport in DCE/RPC binding strings. If the...
authorJelmer Vernooij <jelmer@samba.org>
Wed, 29 Aug 2007 02:01:56 +0000 (02:01 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 20:03:06 +0000 (15:03 -0500)
This means that 'smbtorture localhost RPC-WINREG' works now.
(This used to be commit b7fa0859d2e4236112075604281410ba037b1076)

source4/librpc/rpc/dcerpc_connect.c
source4/librpc/rpc/dcerpc_util.c

index 710474ce3b14fc419c6bd8a54318e6bb8eb8b0df..be95f2159415f3eae41effbfa82d64e741934e17 100644 (file)
@@ -733,6 +733,14 @@ struct composite_context* dcerpc_pipe_connect_b_send(TALLOC_CTX *parent_ctx,
                        dcerpc_connect_timeout_handler, c);
        
        switch (s->binding->transport) {
+       case NCA_UNKNOWN: {
+               struct composite_context *binding_req;
+               binding_req = dcerpc_epm_map_binding_send(c, s->binding, s->table,
+                                                         s->pipe->conn->event_ctx);
+               composite_continue(c, binding_req, continue_map_binding, c);
+               return c;
+               }
+
        case NCACN_NP:
        case NCACN_IP_TCP:
        case NCALRPC:
index f097e53f20ac19068b91a0111f4e8ec88b461046..11f5451891ec161b3cfbae204f21bdde6d7a6a69 100644 (file)
@@ -531,7 +531,9 @@ const char *dcerpc_floor_get_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor *epm
        return NULL;
 }
 
-static NTSTATUS dcerpc_floor_set_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor,  const char *data)
+static NTSTATUS dcerpc_floor_set_rhs_data(TALLOC_CTX *mem_ctx, 
+                                         struct epm_floor *epm_floor,  
+                                         const char *data)
 {
        switch (epm_floor->lhs.protocol) {
        case EPM_PROTOCOL_TCP:
@@ -648,7 +650,9 @@ enum dcerpc_transport_t dcerpc_transport_by_tower(struct epm_tower *tower)
        return (unsigned int)-1;
 }
 
-NTSTATUS dcerpc_binding_from_tower(TALLOC_CTX *mem_ctx, struct epm_tower *tower, struct dcerpc_binding **b_out)
+NTSTATUS dcerpc_binding_from_tower(TALLOC_CTX *mem_ctx, 
+                                  struct epm_tower *tower, 
+                                  struct dcerpc_binding **b_out)
 {
        NTSTATUS status;
        struct dcerpc_binding *binding;
@@ -932,7 +936,7 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
        /*
          First, check if there is a default endpoint specified in the IDL
        */
-       if (table) {
+       if (table != NULL) {
                struct dcerpc_binding *default_binding;
 
                /* Find one of the default pipes for this interface */
@@ -940,7 +944,10 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
                        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) {
+                               if (binding->transport == NCA_UNKNOWN) 
+                                       binding->transport = default_binding->transport;
+                               if (default_binding->transport == binding->transport && 
+                                       default_binding->endpoint) {
                                        binding->endpoint = talloc_reference(binding, default_binding->endpoint);
                                        talloc_free(default_binding);
 
@@ -967,7 +974,8 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
        epmapper_binding->endpoint              = NULL;
 
        /* initiate rpc pipe connection */
-       pipe_connect_req = dcerpc_pipe_connect_b_send(c, epmapper_binding, &ndr_table_epmapper,
+       pipe_connect_req = dcerpc_pipe_connect_b_send(c, epmapper_binding, 
+                                                     &ndr_table_epmapper,
                                                      anon_creds, c->event_ctx);
        if (composite_nomem(pipe_connect_req, c)) return c;