Move the manipulation of site_name into the caller function dsgetdcname().
authorJeremy Allison <jra@samba.org>
Tue, 3 Sep 2013 19:08:46 +0000 (12:08 -0700)
committerKarolin Seeger <kseeger@samba.org>
Fri, 6 Sep 2013 08:54:03 +0000 (10:54 +0200)
Leave dsgetdcname_internal() only using const char *site_name.

Bug 5917 - Samba does not work on site with Read Only Domain Controller

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Richard Sharpe <rsharpe@samba.org>
(cherry picked from commit 181c11066bd53b07015a199f56eb71182e89ff71)

source3/libsmb/dsgetdcname.c

index 6e0d935c960149694564adccec73abc9345c2e00..2318dfbfc8dd317a891e95861b56c02be5b6352e 100644 (file)
@@ -1095,7 +1095,6 @@ static NTSTATUS dsgetdcname_internal(TALLOC_CTX *mem_ctx,
 {
        NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
        struct netr_DsRGetDCNameInfo *myinfo = NULL;
-       char *query_site = NULL;
        bool first = true;
        struct netr_DsRGetDCNameInfo *first_info = NULL;
 
@@ -1103,7 +1102,7 @@ static NTSTATUS dsgetdcname_internal(TALLOC_CTX *mem_ctx,
                  "domain_guid: %s, site_name: %s, flags: 0x%08x\n",
                  domain_name,
                  domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)",
-                 site_name, flags));
+                 site_name ? site_name : "(null)", flags));
 
        *info = NULL;
 
@@ -1112,18 +1111,12 @@ static NTSTATUS dsgetdcname_internal(TALLOC_CTX *mem_ctx,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if ((site_name == NULL) || (site_name[0] == '\0')) {
-               query_site = sitename_fetch(domain_name);
-       } else {
-               query_site = SMB_STRDUP(site_name);
-       }
-
        if (flags & DS_FORCE_REDISCOVERY) {
                goto rediscover;
        }
 
        status = dsgetdcname_cached(mem_ctx, msg_ctx, domain_name, domain_guid,
-                                   flags, query_site, &myinfo);
+                                   flags, site_name, &myinfo);
        if (NT_STATUS_IS_OK(status)) {
                goto done;
        }
@@ -1134,12 +1127,10 @@ static NTSTATUS dsgetdcname_internal(TALLOC_CTX *mem_ctx,
 
  rediscover:
        status = dsgetdcname_rediscover(mem_ctx, msg_ctx, domain_name,
-                                       domain_guid, flags, query_site,
+                                       domain_guid, flags, site_name,
                                        &myinfo);
 
  done:
-       SAFE_FREE(query_site);
-
        if (!NT_STATUS_IS_OK(status)) {
                if (!first) {
                        *info = first_info;
@@ -1154,7 +1145,7 @@ static NTSTATUS dsgetdcname_internal(TALLOC_CTX *mem_ctx,
                first = false;
                first_info = myinfo;
                /* TODO: may use the next_closest_site here */
-               query_site = SMB_STRDUP(myinfo->client_site_name);
+               site_name = myinfo->client_site_name;
                goto rediscover;
        }
 
@@ -1176,11 +1167,24 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx,
                     uint32_t flags,
                     struct netr_DsRGetDCNameInfo **info)
 {
-       return dsgetdcname_internal(mem_ctx,
+       NTSTATUS status;
+       char *query_site = NULL;
+
+       if ((site_name == NULL) || (site_name[0] == '\0')) {
+               query_site = sitename_fetch(domain_name);
+       } else {
+               query_site = SMB_STRDUP(site_name);
+       }
+
+       status = dsgetdcname_internal(mem_ctx,
                                msg_ctx,
                                domain_name,
                                domain_guid,
-                               site_name,
+                               query_site,
                                flags,
                                info);
+
+       SAFE_FREE(query_site);
+
+       return status;
 }