s3/s4: smbd, rpc, ldap, cldap, kdc services.
authorJeremy Allison <jra@samba.org>
Thu, 5 Jun 2014 19:32:30 +0000 (12:32 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 6 Jun 2014 23:01:43 +0000 (01:01 +0200)
Allow us to start if we bind to *either* :: or 0.0.0.0.

Allows us to cope with systems configured as only IPv4
or only IPv6.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-By: Amitay Isaacs <amitay@gmail.com>
Reviewed-By: Alexander Bokovoy <ab@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Jun  7 01:01:44 CEST 2014 on sn-devel-104

source3/smbd/server.c
source4/cldap_server/cldap_server.c
source4/dns_server/dns_server.c
source4/kdc/kdc.c
source4/ldap_server/ldap_server.c
source4/rpc_server/dcerpc_server.c

index 298afb924c4ea003f0914c2fd8bfce9e5d0ea4d0..53d615e4804f2e82472c4b1d256373ef7ddabf72 100644 (file)
@@ -862,12 +862,16 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
                                        continue;
                                }
 
-                               if (!smbd_open_one_socket(parent,
-                                                         ev_ctx,
-                                                         &ss,
-                                                         port)) {
-                                       return false;
-                               }
+                               /*
+                                * If we fail to open any sockets
+                                * in this loop the parent-sockets == NULL
+                                * case below will prevent us from starting.
+                                */
+
+                               (void)smbd_open_one_socket(parent,
+                                                 ev_ctx,
+                                                 &ss,
+                                                 port);
                        }
                }
        }
index d1efa398a7241dbd70aaf040a34b9a93c997635d..682d59180c92b1a6e07c3fbd091024be501edea7 100644 (file)
@@ -153,13 +153,19 @@ static NTSTATUS cldapd_startup_interfaces(struct cldapd_server *cldapd, struct l
        /* if we are allowing incoming packets from any address, then
           we need to bind to the wildcard address */
        if (!lpcfg_bind_interfaces_only(lp_ctx)) {
+               int num_binds = 0;
                char **wcard = iface_list_wildcard(cldapd);
                NT_STATUS_HAVE_NO_MEMORY(wcard);
                for (i=0; wcard[i]; i++) {
                        status = cldapd_add_socket(cldapd, lp_ctx, wcard[i]);
-                       NT_STATUS_NOT_OK_RETURN(status);
+                       if (NT_STATUS_IS_OK(status)) {
+                               num_binds++;
+                       }
                }
                talloc_free(wcard);
+               if (num_binds == 0) {
+                       return NT_STATUS_INVALID_PARAMETER_MIX;
+               }
        }
 
        /* now we have to also listen on the specific interfaces,
index 60ce27c6ff9b8019b0a1d8dcdf77905d31e978b7..7ea70dbcf21cb1d846eefcd309e20ed414bfe2e5 100644 (file)
@@ -693,6 +693,7 @@ static NTSTATUS dns_startup_interfaces(struct dns_server *dns,
                        NT_STATUS_NOT_OK_RETURN(status);
                }
        } else {
+               int num_binds = 0;
                char **wcard;
                wcard = iface_list_wildcard(tmp_ctx);
                if (wcard == NULL) {
@@ -702,7 +703,13 @@ static NTSTATUS dns_startup_interfaces(struct dns_server *dns,
                for (i = 0; wcard[i] != NULL; i++) {
                        status = dns_add_socket(dns, model_ops, "dns", wcard[i],
                                                DNS_SERVICE_PORT);
-                       NT_STATUS_NOT_OK_RETURN(status);
+                       if (NT_STATUS_IS_OK(status)) {
+                               num_binds++;
+                       }
+               }
+               if (num_binds == 0) {
+                       talloc_free(tmp_ctx);
+                       return NT_STATUS_INVALID_PARAMETER_MIX;
                }
        }
 
index 4a16f7e5e029229fd08df8937fcee9f29009e687..bb476e1e6578c31440607a421dc183fbde3f21f3 100644 (file)
@@ -733,6 +733,7 @@ static NTSTATUS kdc_startup_interfaces(struct kdc_server *kdc, struct loadparm_c
        /* if we are allowing incoming packets from any address, then
           we need to bind to the wildcard address */
        if (!lpcfg_bind_interfaces_only(lp_ctx)) {
+               int num_binds = 0;
                char **wcard = iface_list_wildcard(kdc);
                NT_STATUS_HAVE_NO_MEMORY(wcard);
                for (i=0; wcard[i]; i++) {
@@ -740,17 +741,24 @@ static NTSTATUS kdc_startup_interfaces(struct kdc_server *kdc, struct loadparm_c
                                status = kdc_add_socket(kdc, model_ops,
                                                        "kdc", wcard[i], kdc_port,
                                                        kdc_process, false);
-                               NT_STATUS_NOT_OK_RETURN(status);
+                               if (NT_STATUS_IS_OK(status)) {
+                                       num_binds++;
+                               }
                        }
 
                        if (kpasswd_port) {
                                status = kdc_add_socket(kdc, model_ops,
                                                        "kpasswd", wcard[i], kpasswd_port,
                                                        kpasswdd_process, false);
-                               NT_STATUS_NOT_OK_RETURN(status);
+                               if (NT_STATUS_IS_OK(status)) {
+                                       num_binds++;
+                               }
                        }
                }
                talloc_free(wcard);
+               if (num_binds == 0) {
+                       return NT_STATUS_INVALID_PARAMETER_MIX;
+               }
                done_wildcard = true;
        }
 
index 99595ebd12ae2122fd7c25bda5a891898bc6a989..d59668be939f4b80c53d6580da0e3cec414abbc7 100644 (file)
@@ -964,6 +964,7 @@ static void ldapsrv_task_init(struct task_server *task)
        } else {
                char **wcard;
                int i;
+               int num_binds = 0;
                wcard = iface_list_wildcard(task);
                if (wcard == NULL) {
                        DEBUG(0,("No wildcard addresses available\n"));
@@ -971,9 +972,14 @@ static void ldapsrv_task_init(struct task_server *task)
                }
                for (i=0; wcard[i]; i++) {
                        status = add_socket(task, task->lp_ctx, model_ops, wcard[i], ldap_service);
-                       if (!NT_STATUS_IS_OK(status)) goto failed;
+                       if (NT_STATUS_IS_OK(status)) {
+                               num_binds++;
+                       }
                }
                talloc_free(wcard);
+               if (num_binds == 0) {
+                       goto failed;
+               }
        }
 
        ldapi_path = lpcfg_private_path(ldap_service, task->lp_ctx, "ldapi");
index cf737c6aa72e7d4f6c28682eced08081f4cc825c..4d5e166961c6028629b2d6868fb09662efe97a43 100644 (file)
@@ -1829,13 +1829,19 @@ static NTSTATUS dcesrv_add_ep_tcp(struct dcesrv_context *dce_ctx,
        } else {
                char **wcard;
                int i;
+               int num_binds = 0;
                wcard = iface_list_wildcard(dce_ctx);
                NT_STATUS_HAVE_NO_MEMORY(wcard);
                for (i=0; wcard[i]; i++) {
                        status = add_socket_rpc_tcp_iface(dce_ctx, e, event_ctx, model_ops, wcard[i]);
-                       NT_STATUS_NOT_OK_RETURN(status);
+                       if (NT_STATUS_IS_OK(status)) {
+                               num_binds++;
+                       }
                }
                talloc_free(wcard);
+               if (num_binds == 0) {
+                       return NT_STATUS_INVALID_PARAMETER_MIX;
+               }
        }
 
        return NT_STATUS_OK;