diff options
| author | Mark Phalan <Mark.Phalan@Sun.COM> | 2010-01-06 15:44:09 +0100 |
|---|---|---|
| committer | Mark Phalan <Mark.Phalan@Sun.COM> | 2010-01-06 15:44:09 +0100 |
| commit | 4209bc2097a959d7ddabb51581682e4565885eed (patch) | |
| tree | 64c5b6c9de27e21ee545d2bf13744797f6db3dc0 /usr/src | |
| parent | 7801e5e8b5bc4af34929c54a02cfb78398da08dd (diff) | |
| download | illumos-joyent-4209bc2097a959d7ddabb51581682e4565885eed.tar.gz | |
6806014 unable to join domain using kerberos via tcp when no SRV _kerberos-master._tcp is in DNS
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/lib/gss_mechs/mech_krb5/krb5/os/locate_kdc.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/usr/src/lib/gss_mechs/mech_krb5/krb5/os/locate_kdc.c b/usr/src/lib/gss_mechs/mech_krb5/krb5/os/locate_kdc.c index b4017aa0bc..c6a26a6157 100644 --- a/usr/src/lib/gss_mechs/mech_krb5/krb5/os/locate_kdc.c +++ b/usr/src/lib/gss_mechs/mech_krb5/krb5/os/locate_kdc.c @@ -1,5 +1,5 @@ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -807,6 +807,40 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm, krb5_error_code code2; code2 = dns_locate_server(context, realm, &al, svc, socktype, family); + + /* + * Solaris Kerberos: + * If an entry for _kerberos-master. does not exist (checked for + * above) but _kpasswd. does then treat that as an entry for the + * master KDC (but use port 88 not the kpasswd port). MS AD creates + * kpasswd entries by default in DNS. + */ + if (code2 == 0 && svc == locate_service_master_kdc && + al.naddrs == 0) { + + /* Look for _kpasswd._tcp|udp */ + code2 = dns_locate_server(context, realm, &al, + locate_service_kpasswd, socktype, family); + + /* Set the port to 88 instead of the kpasswd port */ + if (code2 == 0 ) { + int i; + struct addrinfo *a; + + for (i = 0; i < al.naddrs; i++) { + if (al.addrs[i].ai->ai_family == AF_INET) + for (a = al.addrs[i].ai; a != NULL; a = a->ai_next) + ((struct sockaddr_in *)a->ai_addr)->sin_port = + htons(KRB5_DEFAULT_PORT); + + if (al.addrs[i].ai->ai_family == AF_INET6) + for (a = al.addrs[i].ai; a != NULL; a = a->ai_next) + ((struct sockaddr_in6 *)a->ai_addr)->sin6_port = + htons(KRB5_DEFAULT_PORT); + } + } + } + if (code2 != KRB5_PLUGIN_NO_HANDLE) code = code2; } |
