From 9792ae2d4862a4afcc49699594beaf85abb6c33b Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Fri, 6 Mar 1998 00:52:36 +0000 Subject: [PATCH] (krb5_425_conv_principal_ext): Use resolver to lookup hosts, so CNAMEs can be ignored. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4550 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/principal.c | 62 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/lib/krb5/principal.c b/lib/krb5/principal.c index a94f7b43e..98c6379f0 100644 --- a/lib/krb5/principal.c +++ b/lib/krb5/principal.c @@ -37,6 +37,8 @@ */ #include "krb5_locl.h" +#define USE_RESOLVER +#include "resolve.h" RCSID("$Id$"); @@ -222,10 +224,11 @@ krb5_unparse_name_fixed_short(krb5_context context, return unparse_name_fixed(context, principal, name, len, TRUE); } -krb5_error_code -krb5_unparse_name(krb5_context context, - krb5_const_principal principal, - char **name) +static krb5_error_code +unparse_name(krb5_context context, + krb5_const_principal principal, + char **name, + krb5_boolean short_flag) { size_t len = 0, plen; int i; @@ -248,12 +251,28 @@ krb5_unparse_name(krb5_context context, *name = malloc(len); if(*name == NULL) return ENOMEM; - ret = krb5_unparse_name_fixed(context, principal, *name, len); + ret = unparse_name_fixed(context, principal, *name, len, short_flag); if(ret) free(*name); return ret; } +krb5_error_code +krb5_unparse_name(krb5_context context, + krb5_const_principal principal, + char **name) +{ + return unparse_name(context, principal, name, FALSE); +} + +krb5_error_code +krb5_unparse_name_short(krb5_context context, + krb5_const_principal principal, + char **name) +{ + return unparse_name(context, principal, name, TRUE); +} + #if 0 /* not implemented */ krb5_error_code @@ -530,17 +549,34 @@ krb5_425_conv_principal_ext(krb5_context context, return HEIM_ERR_V4_PRINC_NO_CONV; } if(resolve){ + const char *inst = NULL; +#ifdef USE_RESOLVER + struct dns_reply *r; + r = dns_lookup(instance, "a"); + if(r && r->head && r->head->type == T_A) + inst = r->head->domain; +#else struct hostent *hp = roken_gethostbyname(instance); - if(hp){ - instance = hp->h_name; - ret = krb5_make_principal(context, &pr, - realm, name, instance, NULL); - if(func == NULL || (*func)(context, pr)){ - *princ = pr; - return 0; + if(hp) + inst = hp->h_name; +#endif + if(inst) { + ret = krb5_make_principal(context, &pr, realm, name, inst, NULL); + if(ret == 0) { + if(func == NULL || (*func)(context, pr)){ + *princ = pr; +#ifdef USE_RESOLVER + dns_free_data(r); +#endif + return 0; + } + krb5_free_principal(context, pr); } - krb5_free_principal(context, pr); } +#ifdef USE_RESOLVER + if(r) + dns_free_data(r); +#endif } { char **domains, **d;