]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add a master flag to struct server_entry
authorMatt Rogers <mrogers@redhat.com>
Wed, 13 Jul 2016 20:27:57 +0000 (16:27 -0400)
committerGreg Hudson <ghudson@mit.edu>
Mon, 19 Sep 2016 15:10:27 +0000 (11:10 -0400)
URI lookups will contain a flag to indicate if the KDC is a master or
normal KDC, so add a master variable to server_entry.  The default
value is -1 and means that the status has not been determined by the
information source.  If the flag is set, use it to avoid a seperate
lookup in k5_kdc_is_master().

Also add a "master" argument to add_host_to_list().  Adjust the
existing calls of add_host_to_list() for the new argument (set to -1
as they are from non-URI lookups).

ticket: 8496

src/lib/krb5/os/locate_kdc.c
src/lib/krb5/os/os-proto.h

index 1e791e9205428dd1a65336650de0043dc61545f5..6ed8fa6740787a0ea693c3b19a32e627411de65f 100644 (file)
@@ -125,6 +125,7 @@ new_server_entry(struct serverlist *list)
     list->servers = newservers;
     entry = &newservers[list->nservers];
     memset(entry, 0, sizeof(*entry));
+    entry->master = -1;
     return entry;
 }
 
@@ -151,7 +152,8 @@ add_addr_to_list(struct serverlist *list, k5_transport transport, int family,
 /* Add a hostname entry to list. */
 static int
 add_host_to_list(struct serverlist *list, const char *hostname, int port,
-                 k5_transport transport, int family, char *uri_path)
+                 k5_transport transport, int family, char *uri_path,
+                 int master)
 {
     struct server_entry *entry;
 
@@ -169,6 +171,7 @@ add_host_to_list(struct serverlist *list, const char *hostname, int port,
             goto oom;
     }
     entry->port = port;
+    entry->master = master;
     list->nservers++;
     return 0;
 oom:
@@ -261,7 +264,7 @@ locate_srv_conf_1(krb5_context context, const krb5_data *realm,
             goto cleanup;
 
         code = add_host_to_list(serverlist, host, port_num, this_transport,
-                                AF_UNSPEC, uri_path);
+                                AF_UNSPEC, uri_path, -1);
         if (code)
             goto cleanup;
 
@@ -317,7 +320,7 @@ locate_srv_dns_1(const krb5_data *realm, const char *service,
     for (entry = head; entry != NULL; entry = entry->next) {
         transport = (strcmp(protocol, "_tcp") == 0) ? TCP : UDP;
         code = add_host_to_list(serverlist, entry->host, entry->port,
-                                transport, AF_UNSPEC, NULL);
+                                transport, AF_UNSPEC, NULL, -1);
         if (code)
             goto cleanup;
     }
@@ -645,6 +648,9 @@ k5_kdc_is_master(krb5_context context, const krb5_data *realm,
     struct serverlist list;
     krb5_boolean found;
 
+    if (server->master != -1)
+        return server->master;
+
     if (locate_server(context, realm, &list, locate_service_master_kdc,
                       server->transport) != 0)
         return FALSE;
index 2134426b5dfee7ea359234e12dfb1445d09aeb64..7cf5a48792b6558bb940672ba7cc2c044a205a4f 100644 (file)
@@ -58,6 +58,7 @@ struct server_entry {
     k5_transport transport;     /* May be 0 for UDP/TCP if hostname set */
     char *uri_path;             /* Used only if transport is HTTPS */
     int family;                 /* May be 0 (aka AF_UNSPEC) if hostname set */
+    int master;                 /* True, false, or -1 for unknown. */
     size_t addrlen;
     struct sockaddr_storage addr;
 };