From: Matt Rogers Date: Wed, 13 Jul 2016 20:27:57 +0000 (-0400) Subject: Add a master flag to struct server_entry X-Git-Tag: krb5-1.15-beta1~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0df76499101d10f71e975e30ba899e63b158792c;p=thirdparty%2Fkrb5.git Add a master flag to struct server_entry 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 --- diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c index 1e791e9205..6ed8fa6740 100644 --- a/src/lib/krb5/os/locate_kdc.c +++ b/src/lib/krb5/os/locate_kdc.c @@ -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; diff --git a/src/lib/krb5/os/os-proto.h b/src/lib/krb5/os/os-proto.h index 2134426b5d..7cf5a48792 100644 --- a/src/lib/krb5/os/os-proto.h +++ b/src/lib/krb5/os/os-proto.h @@ -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; };