[1329] in Kerberos-V5-bugs
Memory leaks in the kdc
daemon@ATHENA.MIT.EDU (epeisach@MIT.EDU)
Tue Apr 11 15:26:50 1995
From: epeisach@MIT.EDU
Date: Tue, 11 Apr 1995 15:25:06 -0400
To: krb5-bugs@MIT.EDU
I would prefer for someone else to audit these...
Some of the changes appear gratuitous - freeing memory before calling
exit, but I found it quite beneficial when using a memory debugger to
have all known memory cleaned up and freed before exiting.. It made
tracking down the leaks alot easier... (especially the lookaside
memory).
Ezra
Changes:
do_tgs_req.c: Free the header_ticket which is allocated
kdc_util.c: Don't nuke a pointer to allocated memory (to which
caller has no handle on)
kdc_util.h: Add prototype for kdc_shutdown_lookaside
main.c:
call finish_random_key on shutdown
call kdc_shutdown_lookaside on shutdown
clear/free memory associated with the master_keyblock...
replay.c:
Add a routine to shutdown the lookaside cache... (just
frees memory at shutdown).
Index: do_tgs_req.c
===================================================================
RCS file: /mit/krb5/.cvsroot/src/kdc/do_tgs_req.c,v
retrieving revision 5.54
diff -c -r5.54 do_tgs_req.c
*** do_tgs_req.c 1995/03/27 14:48:23 5.54
--- do_tgs_req.c 1995/03/30 19:04:12
***************
*** 644,649 ****
--- 644,651 ----
krb5_free_keyblock(kdc_context, session_key);
if (newtransited)
free(enc_tkt_reply.transited.tr_contents.data);
+ if (header_ticket)
+ krb5_free_ticket(kdc_context, header_ticket);
return retval;
}
Index: kdc_util.c
===================================================================
RCS file: /mit/krb5/.cvsroot/src/kdc/kdc_util.c,v
retrieving revision 5.65
diff -c -r5.65 kdc_util.c
*** kdc_util.c 1995/03/27 14:48:27 5.65
--- kdc_util.c 1995/03/30 19:21:02
***************
*** 292,298 ****
krb5_auth_con_free(kdc_context, auth_context);
cleanup:
- apreq->ticket = 0; /* Caller will free the ticket */
krb5_free_ap_req(kdc_context, apreq);
return retval;
}
--- 292,297 ----
Index: kdc_util.h
===================================================================
RCS file: /mit/krb5/.cvsroot/src/kdc/kdc_util.h,v
retrieving revision 5.28
diff -c -r5.28 kdc_util.h
*** kdc_util.h 1995/03/27 14:48:30 5.28
--- kdc_util.h 1995/03/28 20:46:39
***************
*** 82,87 ****
--- 82,88 ----
/* replay.c */
krb5_boolean kdc_check_lookaside PROTOTYPE((krb5_data *, krb5_data **));
void kdc_insert_lookaside PROTOTYPE((krb5_data *, krb5_data *));
+ void kdc_shutdown_lookaside PROTOTYPE((void));
/* which way to convert key? */
#define CONVERT_INTO_DB 0
Index: main.c
===================================================================
RCS file: /mit/krb5/.cvsroot/src/kdc/main.c,v
retrieving revision 5.48
diff -c -r5.48 main.c
*** main.c 1995/03/31 21:51:05 5.48
--- main.c 1995/04/03 04:13:32
***************
*** 260,265 ****
--- 260,266 ----
{
char *rtype, *rname;
krb5_error_code retval;
+ krb5_enctype etype;
if (kdc_rcache) {
if (kdc_rcache->ops && kdc_rcache->ops->type)
***************
*** 274,279 ****
--- 275,297 ----
free(rtype);
free(rname);
}
+
+ /* finish the random key generators */
+ for (etype = 0; etype <= krb5_max_cryptosystem; etype++) {
+ if (krb5_csarray[etype]) {
+ if (retval = (*krb5_csarray[etype]->system->
+ finish_random_key)(
+ &krb5_csarray[etype]->random_sequence)) {
+ com_err(prog, retval, "while finishhing up random key generator for etype %d", etype);
+ }
+ }
+ }
+
+ kdc_shutdown_lookaside();
+
+ /* And finally, free the context */
+ krb5_free_context(kdc_context);
+
return;
}
***************
*** 388,393 ****
--- 406,419 ----
memset((char *)&master_encblock, 0, sizeof(master_encblock));
memset((char *)tgs_key.contents, 0, tgs_key.length);
+
+ krb5_xfree(tgs_key.contents);
+
+ memset((char *)master_keyblock.contents, 0, master_keyblock.length);
+
+ krb5_xfree(master_keyblock.contents);
+
+ krb5_free_principal(kdc_context, master_princ);
/* close database */
if (retval) {
Index: replay.c
===================================================================
RCS file: /mit/krb5/.cvsroot/src/kdc/replay.c,v
retrieving revision 5.10
diff -c -r5.10 replay.c
*** replay.c 1995/03/24 22:28:07 5.10
--- replay.c 1995/03/28 20:45:07
***************
*** 147,149 ****
--- 147,162 ----
num_entries++;
return;
}
+
+ void kdc_shutdown_lookaside()
+ {
+ register krb5_kdc_replay_ent *eptr, *hold;
+
+ for (eptr = root_ptr.next; eptr;) {
+ krb5_free_data(kdc_context, eptr->req_packet);
+ krb5_free_data(kdc_context, eptr->reply_packet);
+ hold = eptr->next;
+ krb5_xfree(eptr);
+ eptr = hold;
+ }
+ }