[681] in Kerberos-V5-bugs
Memory leaks in krb5_ktfileint_internal_read_entry
daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Thu Aug 25 16:21:16 1994
Date: Thu, 25 Aug 1994 16:22:21 -0400
From: "Jonathan I. Kamens" <jik@cam.ov.com>
To: krb5-bugs@MIT.EDU
This patch fixes a number of memory leaks when
krb5_ktfileint_internal_read_entry fails.
*** ktf_util.c 1993/09/20 20:21:52 1.1
--- ktf_util.c 1994/08/25 20:19:00
***************
*** 257,265 ****
char *tmpdata;
krb5_data *princ;
- if (!(ret_entry = (krb5_keytab_entry *)calloc(1, sizeof(*ret_entry))))
- return ENOMEM;
-
/* fseek to synchronise buffered I/O on the key table. */
if (fseek(KTFILEP(id), 0L, SEEK_CUR) < 0)
--- 257,262 ----
***************
*** 300,313 ****
}
if (!count || (count < 0))
return KRB5_KT_END;
! ret_entry->principal = (krb5_principal)malloc(sizeof(krb5_principal_data));
! if (!ret_entry->principal)
return ENOMEM;
!
ret_entry->principal->length = count;
ret_entry->principal->data = (krb5_data *)calloc(count, sizeof(krb5_data));
if (!ret_entry->principal->data) {
! free(ret_entry->principal);
return ENOMEM;
}
--- 297,318 ----
}
if (!count || (count < 0))
return KRB5_KT_END;
!
! if (!(ret_entry = (krb5_keytab_entry *)calloc(1, sizeof(*ret_entry))))
! return ENOMEM;
!
! ret_entry->principal = (krb5_principal)calloc(1,
! sizeof(krb5_principal_data));
! if (!ret_entry->principal) {
! free(ret_entry);
return ENOMEM;
! }
!
ret_entry->principal->length = count;
ret_entry->principal->data = (krb5_data *)calloc(count, sizeof(krb5_data));
if (!ret_entry->principal->data) {
! free(ret_entry->principal);
! free(ret_entry);
return ENOMEM;
}
***************
*** 429,435 ****
fseek(KTFILEP(id), start_pos + size, SEEK_SET);
return 0;
fail:
!
for (i = 0; i < ret_entry->principal->length; i++) {
princ = krb5_princ_component(ret_entry->principal, i);
if (princ->data)
--- 434,444 ----
fseek(KTFILEP(id), start_pos + size, SEEK_SET);
return 0;
fail:
!
! if (ret_entry->key.contents)
! free(ret_entry->key.contents);
! if (ret_entry->principal->realm.data)
! free(ret_entry->principal->realm.data);
for (i = 0; i < ret_entry->principal->length; i++) {
princ = krb5_princ_component(ret_entry->principal, i);
if (princ->data)
***************
*** 437,442 ****
--- 446,452 ----
}
free(ret_entry->principal->data);
free(ret_entry->principal);
+ free(ret_entry);
return error;
}