diff --git a/lib/krb5/krbhst.c b/lib/krb5/krbhst.c index c1f7a0251..8655ac672 100644 --- a/lib/krb5/krbhst.c +++ b/lib/krb5/krbhst.c @@ -45,63 +45,23 @@ krb5_get_krbhst (krb5_context context, const krb5_realm *realm, char ***hostlist) { - char **res; - unsigned max, count; - krb5_config_binding *pointer; - char *r; - krb5_boolean done; - char **tmp; - - r = *realm; - - count = 0; - max = 10; - res = malloc(max * sizeof(*res)); - if(res == NULL) - return KRB5_REALM_UNKNOWN; - pointer = NULL; - for(done = FALSE; !done;) { - char *h = (char *)krb5_config_get_next (context->cf, - &pointer, - krb5_config_string, - "realms", - r, - "kdc", - NULL); - - if (count > max - 2) { - max += 10; - tmp = realloc (res, max * sizeof(*res)); - if (tmp == NULL) { - res[count] = NULL; - free (r); - krb5_free_krbhst (context, res); - return KRB5_REALM_UNKNOWN; - } - res = tmp; - } - if (h == NULL) { - done = TRUE; - asprintf(&res[count], "kerberos.%s", r); - } else { - res[count] = strdup(h); - } - if (res[count] == NULL) { - free(r); - krb5_free_krbhst (context, res); - return KRB5_REALM_UNKNOWN; - } - ++count; + char **res, **r; + int count; + res = krb5_config_get_strings(context, NULL, + "realms", *realm, "kdc", NULL); + for(r = res, count = 0; r && *r; r++, count++); + r = realloc(res, (count + 2) * sizeof(*res)); + if(r == NULL){ + krb5_config_free_strings(res); + return ENOMEM; } - - /* There should always be room for the NULL here */ - res[count++] = NULL; - tmp = realloc (res, count * sizeof(*res)); - if (tmp == NULL) { - krb5_free_krbhst (context, res); - return KRB5_REALM_UNKNOWN; + res = r; + asprintf(&res[count], "kerberos.%s", *realm); + if(res[count] == NULL){ + krb5_config_free_strings(res); + return ENOMEM; } - res = tmp; + res[count + 1] = NULL; *hostlist = res; return 0; }