krb5: Fix leak in gethostlist()
This commit is contained in:
@@ -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);
|
||||||
|
Reference in New Issue
Block a user