diff options
Diffstat (limited to 'src/lib/krb5/asn.1/addr2kaddr.c')
-rw-r--r-- | src/lib/krb5/asn.1/addr2kaddr.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/lib/krb5/asn.1/addr2kaddr.c b/src/lib/krb5/asn.1/addr2kaddr.c index 8bc295bedc..32a0989e2f 100644 --- a/src/lib/krb5/asn.1/addr2kaddr.c +++ b/src/lib/krb5/asn.1/addr2kaddr.c @@ -34,6 +34,10 @@ KRB5_HostAddresses2krb5_address(val, error) const struct type_KRB5_HostAddresses *val; register int *error; { +#if 0 + /* this code is for -h2 style ISODE structures. However, pepsy + generates horribly broken when given -h2. */ + register krb5_address **retval; register int i; @@ -57,6 +61,7 @@ register int *error; retval[i]->contents = (unsigned char *)xmalloc(val->element_KRB5_0[i]->address->qb_forw->qb_len); if (!retval[i]->contents) { xfree(retval[i]); + retval[i] = 0; krb5_free_address(retval); goto nomem; } @@ -67,5 +72,45 @@ register int *error; } retval[i] = 0; return(retval); +#endif + + register krb5_address **retval; + register int i; + register struct type_KRB5_HostAddresses *rv; + + for (i = 0, rv = val; rv; i++, rv = rv->next) + ; + + /* plus one for null terminator */ + retval = (krb5_address **) xcalloc(i + 1, sizeof(*retval)); + if (!retval) { + nomem: + *error = ENOMEM; + return(0); + } + for (i = 0, rv = val; rv; rv = rv->next, i++) { + if (qb_pullup(rv->element_KRB5_0->address) != OK) { + xfree(retval); + goto nomem; + } + retval[i] = (krb5_address *) xmalloc(sizeof(*retval[i])); + if (!retval[i]) { + krb5_free_address(retval); + goto nomem; + } + retval[i]->contents = (unsigned char *)xmalloc(rv->element_KRB5_0->address->qb_forw->qb_len); + if (!retval[i]->contents) { + xfree(retval[i]); + retval[i] = 0; + krb5_free_address(retval); + goto nomem; + } + retval[i]->addrtype = rv->element_KRB5_0->addr__type; + retval[i]->length = rv->element_KRB5_0->address->qb_forw->qb_len; + xbcopy(rv->element_KRB5_0->address->qb_forw->qb_data, + retval[i]->contents, retval[i]->length); + } + retval[i] = 0; + return(retval); } |