[1329] in Kerberos-V5-bugs

home help back first fref pref prev next nref lref last post

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;
+     }
+ }

home help back first fref pref prev next nref lref last post