hdb: read_master_keytab free memory on failure

read_master_keytab() should always return with *mkey == NULL on
failure.  Doing otherwise can result in memory leaks or use of
an uninitialized pointer.

Change-Id: Ice1fd504ca573d73bb51dd3b01770c3f8bc59fd4
This commit is contained in:
Jeffrey Altman
2016-11-19 00:16:59 -05:00
parent cdf5d324e3
commit e772511b78

View File

@@ -119,6 +119,7 @@ read_master_keytab(krb5_context context, const char *filename,
krb5_keytab_entry entry; krb5_keytab_entry entry;
hdb_master_key p; hdb_master_key p;
*mkey = NULL;
ret = krb5_kt_resolve(context, filename, &id); ret = krb5_kt_resolve(context, filename, &id);
if(ret) if(ret)
return ret; return ret;
@@ -126,7 +127,6 @@ read_master_keytab(krb5_context context, const char *filename,
ret = krb5_kt_start_seq_get(context, id, &cursor); ret = krb5_kt_start_seq_get(context, id, &cursor);
if(ret) if(ret)
goto out; goto out;
*mkey = NULL;
while(krb5_kt_next_entry(context, id, &entry, &cursor) == 0) { while(krb5_kt_next_entry(context, id, &entry, &cursor) == 0) {
p = calloc(1, sizeof(*p)); p = calloc(1, sizeof(*p));
if(p == NULL) { if(p == NULL) {
@@ -136,12 +136,24 @@ read_master_keytab(krb5_context context, const char *filename,
} }
p->keytab = entry; p->keytab = entry;
ret = krb5_crypto_init(context, &p->keytab.keyblock, 0, &p->crypto); ret = krb5_crypto_init(context, &p->keytab.keyblock, 0, &p->crypto);
if (ret) {
krb5_kt_end_seq_get(context, id, &cursor);
goto out;
}
p->next = *mkey; p->next = *mkey;
*mkey = p; *mkey = p;
} }
krb5_kt_end_seq_get(context, id, &cursor); krb5_kt_end_seq_get(context, id, &cursor);
out: out:
krb5_kt_close(context, id); krb5_kt_close(context, id);
if (ret) {
/* do not return allocated memory on failure */
do {
p = *mkey->next;
free(*mkey);
*mkey = p;
} while (p != NULL);
}
return ret; return ret;
} }