Move the retry logic when site_name is passed in a NULL or "" to the wrapper function.
authorJeremy Allison <jra@samba.org>
Tue, 3 Sep 2013 19:20:52 +0000 (12:20 -0700)
committerKarolin Seeger <kseeger@samba.org>
Fri, 6 Sep 2013 08:54:03 +0000 (10:54 +0200)
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 68e7b1c9446c7d1274b0fb85b59b90ac1a7f6041)

source3/libsmb/dsgetdcname.c

index 2318dfbfc8dd317a891e95861b56c02be5b6352e..43b3fd89807006955172f9c8cd5961bfdd1e0894 100644 (file)
@@ -1168,12 +1168,14 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx,
                     struct netr_DsRGetDCNameInfo **info)
 {
        NTSTATUS status;
-       char *query_site = NULL;
+       const char *query_site = NULL;
+       char *ptr_to_free = NULL;
 
        if ((site_name == NULL) || (site_name[0] == '\0')) {
-               query_site = sitename_fetch(domain_name);
+               ptr_to_free = sitename_fetch(domain_name);
+               query_site = ptr_to_free;
        } else {
-               query_site = SMB_STRDUP(site_name);
+               query_site = site_name;
        }
 
        status = dsgetdcname_internal(mem_ctx,
@@ -1184,7 +1186,22 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx,
                                flags,
                                info);
 
-       SAFE_FREE(query_site);
+       SAFE_FREE(ptr_to_free);
+
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) {
+               return status;
+       }
+
+       /* Should we try again with site_name == NULL ? */
+       if ((site_name == NULL) || (site_name[0] == '\0')) {
+               status = dsgetdcname_internal(mem_ctx,
+                                       msg_ctx,
+                                       domain_name,
+                                       domain_guid,
+                                       NULL,
+                                       flags,
+                                       info);
+       }
 
        return status;
 }