s3-epmap: Return the correct ip address.
authorAndreas Schneider <asn@samba.org>
Tue, 22 Feb 2011 15:48:43 +0000 (16:48 +0100)
committerGünther Deschner <gd@samba.org>
Tue, 8 Mar 2011 10:41:29 +0000 (11:41 +0100)
Signed-off-by: Günther Deschner <gd@samba.org>
source3/rpc_server/epmapper/srv_epmapper.c

index c364890afa949dc08787b89f2fac92cc6261d374..1852b5bf9779d7cffbf191a79f55dbccc3b35a94 100644 (file)
@@ -154,6 +154,7 @@ static struct dcesrv_endpoint *find_endpoint(struct dcesrv_endpoint *endpoint_li
 static uint32_t build_ep_list(TALLOC_CTX *mem_ctx,
                              struct dcesrv_endpoint *endpoint_list,
                              const struct GUID *uuid,
 static uint32_t build_ep_list(TALLOC_CTX *mem_ctx,
                              struct dcesrv_endpoint *endpoint_list,
                              const struct GUID *uuid,
+                             const char *srv_addr,
                              struct dcesrv_ep_iface **peps)
 {
        struct dcesrv_ep_iface *eps = NULL;
                              struct dcesrv_ep_iface **peps)
 {
        struct dcesrv_ep_iface *eps = NULL;
@@ -185,6 +186,11 @@ static uint32_t build_ep_list(TALLOC_CTX *mem_ctx,
 
                        description = d->ep_description;
                        description->object = iface->iface->syntax_id;
 
                        description = d->ep_description;
                        description->object = iface->iface->syntax_id;
+                       if (description->transport == NCACN_IP_TCP &&
+                           srv_addr != NULL &&
+                           strequal(description->host, "0.0.0.0")) {
+                               description->host = srv_addr;
+                       }
 
                        status = dcerpc_binding_build_tower(eps,
                                                            description,
 
                        status = dcerpc_binding_build_tower(eps,
                                                            description,
@@ -467,6 +473,7 @@ error_status_t _epm_Lookup(struct pipes_struct *p,
                        eps->count = build_ep_list(eps,
                                                   endpoint_table,
                                                   NULL,
                        eps->count = build_ep_list(eps,
                                                   endpoint_table,
                                                   NULL,
+                                                  p->server_id == NULL ? NULL : p->server_id->addr,
                                                   &eps->e);
                        break;
                case RPC_C_EP_MATCH_BY_IF:
                                                   &eps->e);
                        break;
                case RPC_C_EP_MATCH_BY_IF:
@@ -489,6 +496,7 @@ error_status_t _epm_Lookup(struct pipes_struct *p,
                        eps->count = build_ep_list(eps,
                                                   endpoint_table,
                                                   &r->in.interface_id->uuid,
                        eps->count = build_ep_list(eps,
                                                   endpoint_table,
                                                   &r->in.interface_id->uuid,
+                                                  p->server_id == NULL ? NULL : p->server_id->addr,
                                                   &eps->e);
                        break;
                case RPC_C_EP_MATCH_BY_OBJ:
                                                   &eps->e);
                        break;
                case RPC_C_EP_MATCH_BY_OBJ:
@@ -499,6 +507,7 @@ error_status_t _epm_Lookup(struct pipes_struct *p,
                        eps->count = build_ep_list(eps,
                                                   endpoint_table,
                                                   r->in.object,
                        eps->count = build_ep_list(eps,
                                                   endpoint_table,
                                                   r->in.object,
+                                                  p->server_id == NULL ? NULL : p->server_id->addr,
                                                   &eps->e);
                        break;
                default:
                                                   &eps->e);
                        break;
                default:
@@ -850,6 +859,7 @@ error_status_t _epm_Map(struct pipes_struct *p,
                eps->count = build_ep_list(eps,
                                           endpoint_table,
                                           obj,
                eps->count = build_ep_list(eps,
                                           endpoint_table,
                                           obj,
+                                          p->server_id == NULL ? NULL : p->server_id->addr,
                                           &eps->e);
                if (eps->count == 0) {
                        rc = EPMAPPER_STATUS_NO_MORE_ENTRIES;
                                           &eps->e);
                if (eps->count == 0) {
                        rc = EPMAPPER_STATUS_NO_MORE_ENTRIES;