krb5: Fix leak in gethostlist()

This commit is contained in:
Nicolas Williams
2020-09-07 21:53:30 -05:00
parent fbb3bd3f8b
commit 0a0bf32935

View File

@@ -1088,24 +1088,25 @@ gethostlist(krb5_context context, const char *realm,
if (ret) if (ret)
return ret; return ret;
while(krb5_krbhst_next(context, handle, &hostinfo) == 0) while (krb5_krbhst_next(context, handle, &hostinfo) == 0)
nhost++; nhost++;
if(nhost == 0) { if (nhost == 0) {
krb5_set_error_message(context, KRB5_KDC_UNREACH, krb5_set_error_message(context, KRB5_KDC_UNREACH,
N_("No KDC found for realm %s", ""), realm); N_("No KDC found for realm %s", ""), realm);
krb5_krbhst_free(context, handle);
return KRB5_KDC_UNREACH; return KRB5_KDC_UNREACH;
} }
*hostlist = calloc(nhost + 1, sizeof(**hostlist)); *hostlist = calloc(nhost + 1, sizeof(**hostlist));
if(*hostlist == NULL) { if (*hostlist == NULL) {
krb5_krbhst_free(context, handle); krb5_krbhst_free(context, handle);
return krb5_enomem(context); return krb5_enomem(context);
} }
krb5_krbhst_reset(context, handle); krb5_krbhst_reset(context, handle);
nhost = 0; nhost = 0;
while(krb5_krbhst_next_as_string(context, handle, while (krb5_krbhst_next_as_string(context, handle,
host, sizeof(host)) == 0) { host, sizeof(host)) == 0) {
if(((*hostlist)[nhost++] = strdup(host)) == NULL) { if (((*hostlist)[nhost++] = strdup(host)) == NULL) {
krb5_free_krbhst(context, *hostlist); krb5_free_krbhst(context, *hostlist);
krb5_krbhst_free(context, handle); krb5_krbhst_free(context, handle);
return krb5_enomem(context); return krb5_enomem(context);