From: Greg Hudson Date: Fri, 8 Jun 2012 22:40:22 +0000 (-0400) Subject: Clean up default_an_to_ln and fix a minor leak X-Git-Tag: krb5-1.11-alpha1~505 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf520a2d2ed60360f6bad145ef749a10723bc4da;p=thirdparty%2Fkrb5.git Clean up default_an_to_ln and fix a minor leak The default realm could be leaked if the principal had the wrong number of components. Reported by Russ Allbery. ticket: 7161 --- diff --git a/src/lib/krb5/os/an_to_ln.c b/src/lib/krb5/os/an_to_ln.c index a5846c78bc..8108f3478b 100644 --- a/src/lib/krb5/os/an_to_ln.c +++ b/src/lib/krb5/os/an_to_ln.c @@ -599,46 +599,34 @@ cleanup: * that name is returned as the lname. */ static krb5_error_code -default_an_to_ln(krb5_context context, krb5_const_principal aname, const unsigned int lnsize, char *lname) +default_an_to_ln(krb5_context context, krb5_const_principal aname, + const unsigned int lnsize, char *lname) { - krb5_error_code retval; + krb5_error_code ret; char *def_realm; - unsigned int realm_length; - - realm_length = krb5_princ_realm(context, aname)->length; - - if ((retval = krb5_get_default_realm(context, &def_realm))) { - return(retval); - } - if (!data_eq_string(*krb5_princ_realm(context, aname), def_realm)) { - free(def_realm); - return KRB5_LNAME_NOTRANS; - } - if (krb5_princ_size(context, aname) != 1) { - if (krb5_princ_size(context, aname) == 2 ) { - /* Check to see if 2nd component is the local realm. */ - if ( strncmp(krb5_princ_component(context, aname,1)->data,def_realm, - realm_length) || - realm_length != krb5_princ_component(context, aname,1)->length) - return KRB5_LNAME_NOTRANS; - } - else - /* no components or more than one component to non-realm part of name - --no translation. */ - return KRB5_LNAME_NOTRANS; + ret = krb5_get_default_realm(context, &def_realm); + if (ret) + return ret; + + if (!data_eq_string(aname->realm, def_realm)) { + ret = KRB5_LNAME_NOTRANS; + } else if (aname->length == 2) { + /* Check to see if second component is the local realm. */ + if (!data_eq_string(aname->data[1], def_realm)) + ret = KRB5_LNAME_NOTRANS; + } else if (aname->length != 1) { + ret = KRB5_LNAME_NOTRANS; } - free(def_realm); - strncpy(lname, krb5_princ_component(context, aname,0)->data, - min(krb5_princ_component(context, aname,0)->length,lnsize)); - if (lnsize <= krb5_princ_component(context, aname,0)->length ) { - retval = KRB5_CONFIG_NOTENUFSPACE; - } else { - lname[krb5_princ_component(context, aname,0)->length] = '\0'; - retval = 0; - } - return retval; + if (ret) + return ret; + + if (aname->data[0].length >= lnsize) + return KRB5_CONFIG_NOTENUFSPACE; + memcpy(lname, aname->data[0].data, aname->data[0].length); + lname[aname->data[0].length] = '\0'; + return 0; } /*