s3: winbindd: Old NT Domain code sets struct winbind_domain->alt_name to be NULL...
authorJeremy Allison <jra@samba.org>
Wed, 16 Jul 2014 19:41:55 +0000 (12:41 -0700)
committerMichael Adam <obnox@samba.org>
Mon, 15 Sep 2014 21:29:00 +0000 (23:29 +0200)
There are places in the code where we're not checking that alt_name is NULL
and then calling into the DC lookup code with a NULL name request. This can
happen in offline mode.

Fixes bug #10717 - Winbind crash on losing VPN connection

https://bugzilla.samba.org/show_bug.cgi?id=10717

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Autobuild-User(master): Michael Adam <obnox@samba.org>
Autobuild-Date(master): Mon Sep 15 23:29:00 CEST 2014 on sn-devel-104

source3/winbindd/winbindd_ads.c
source3/winbindd/winbindd_cm.c

index cfda82c20af523be001711561ed31f2ef30c342a..2e2239b47de8af24713e24a84e75a2334445a54e 100644 (file)
@@ -183,6 +183,7 @@ ADS_STATUS ads_idmap_cached_connection(ADS_STRUCT **adsp, const char *dom_name)
        }
 
        if (IS_DC) {
+               SMB_ASSERT(wb_dom->alt_name != NULL);
                realm = SMB_STRDUP(wb_dom->alt_name);
        } else {
                struct winbindd_domain *our_domain = wb_dom;
@@ -239,7 +240,7 @@ static ADS_STRUCT *ads_cached_connection(struct winbindd_domain *domain)
        }
 
        if ( IS_DC ) {
-
+               SMB_ASSERT(domain->alt_name != NULL);
                realm = SMB_STRDUP(domain->alt_name);
        }
        else {
index 95c0aa8ed2757e97d8aeddfe8fe40f1f900f8a72..01a4aa2196a53700416b240fca01bed4c36d7e55 100644 (file)
@@ -836,6 +836,10 @@ static NTSTATUS get_trust_creds(const struct winbindd_domain *domain,
                        return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;                       
                }
 
+               if (our_domain->alt_name == NULL) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+
                if (asprintf(machine_krb5_principal, "%s$@%s",
                             account_name, our_domain->alt_name) == -1)
                {
@@ -1202,7 +1206,7 @@ static bool dcip_to_name(TALLOC_CTX *mem_ctx,
        /* For active directory servers, try to get the ldap server name.
           None of these failures should be considered critical for now */
 
-       if (lp_security() == SEC_ADS) {
+       if ((lp_security() == SEC_ADS) && (domain->alt_name != NULL)) {
                ADS_STRUCT *ads;
                ADS_STATUS ads_status;
                char addr[INET6_ADDRSTRLEN];
@@ -1328,7 +1332,7 @@ static bool get_dcs(TALLOC_CTX *mem_ctx, struct winbindd_domain *domain,
                return True;
        }
 
-       if (sec == SEC_ADS) {
+       if ((sec == SEC_ADS) && (domain->alt_name != NULL)) {
                char *sitename = NULL;
 
                /* We need to make sure we know the local site before