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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user