* main.c: On exit, free more allocated memory, including:
authorEzra Peisach <epeisach@mit.edu>
Fri, 3 Jan 2003 16:28:45 +0000 (16:28 +0000)
committerEzra Peisach <epeisach@mit.edu>
Fri, 3 Jan 2003 16:28:45 +0000 (16:28 +0000)
realm_tcp_ports data, kdc_realmlist, close the replay cache, and
free the lookaside cache.

* network.c (FREE_SET_DATA): Do not free a NULL pointer.

* replay.c, kdc_util.h: Add kdc_free_lookaside() to clear the lookaside
cache on shutdown - to search for memory leaks.

* rtest.c (main): Do not allocate or free a NULL pointer.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@15080 dc483132-0cff-0310-8789-dd5450dbe970

src/kdc/ChangeLog
src/kdc/kdc_util.h
src/kdc/main.c
src/kdc/network.c
src/kdc/replay.c
src/kdc/rtest.c

index 4f771c6566b55cf7511ba04ddbfe27f7a4ea8ffb..0e58dece847cb7e4b2a19bac63afb3a875c7dd60 100644 (file)
@@ -1,3 +1,16 @@
+2003-01-03  Ezra Peisach  <epeisach@bu.edu>
+
+       * main.c: On exit, free more allocated memory, including:
+       realm_tcp_ports data, kdc_realmlist, close the replay cache, and
+       free the lookaside cache.
+
+       * network.c (FREE_SET_DATA): Do not free a NULL pointer.
+
+       * replay.c, kdc_util.h: Add kdc_free_lookaside() to clear the lookaside
+       cache on shutdown - to search for memory leaks.
+
+       * rtest.c (main): Do not allocate or free a NULL pointer.
+
 2002-12-30  Ken Raeburn  <raeburn@mit.edu>
 
        * kerberos_v4.c (process_v4): Use a temporary variable for the
index 8e48932e48a97a9b61a2ad15f517a5ca2bc6034a..11a916078dba61d324a40743982e670d203b3b11 100644 (file)
@@ -158,6 +158,7 @@ krb5_boolean kdc_check_lookaside (krb5_data *, const krb5_fulladdr *,
                                            krb5_data **);
 void kdc_insert_lookaside (krb5_data *, const krb5_fulladdr *,
                                     krb5_data *);
+void kdc_free_lookaside(void);
 
 /* sock2p.c */
 extern void sockaddr2p (const struct sockaddr *, char *, size_t, int *);
index 67be4751ae75cb30887ee3c784e8fc3123f977b4..c338b53a855c7f8fe46dbc3a05478c879314e6f1 100644 (file)
@@ -119,6 +119,8 @@ finish_realm(kdc_realm_t *rdp)
        free(rdp->realm_stash);
     if (rdp->realm_ports)
        free(rdp->realm_ports);
+    if (rdp->realm_tcp_ports)
+       free(rdp->realm_tcp_ports);
     if (rdp->realm_kstypes)
        free(rdp->realm_kstypes);
     if (rdp->realm_keytab)
@@ -140,6 +142,7 @@ finish_realm(kdc_realm_t *rdp)
        krb5_free_context(rdp->realm_context);
     }
     memset((char *) rdp, 0, sizeof(*rdp));
+    free(rdp);
 }
 
 /*
@@ -737,8 +740,10 @@ finish_realms(char *prog)
 {
     int i;
 
-    for (i = 0; i < kdc_numrealms; i++)
+    for (i = 0; i < kdc_numrealms; i++) {
        finish_realm(kdc_realmlist[i]);
+       kdc_realmlist[i] = 0;
+    }
 }
 
 /*
@@ -837,6 +842,14 @@ int main(int argc, char **argv)
     krb5_klog_syslog(LOG_INFO, "shutting down");
     krb5_klog_close(kdc_context);
     finish_realms(argv[0]);
+    if (kdc_realmlist) 
+      free(kdc_realmlist);
+#ifdef USE_RCACHE
+    (void) krb5_rc_close(kdc_context, kdc_rcache);
+#endif
+#ifndef NOCACHE
+    kdc_free_lookaside();
+#endif
     krb5_free_context(kcontext);
     return errout;
 }
index 56edc40787bd85fbb58c25591f9373e318771a9a..4c49102a945a65c8838100d4ec046eeffeced912 100644 (file)
@@ -205,7 +205,8 @@ struct connection {
 #define DEL(set, idx) \
   (set.data[idx] = set.data[--set.n], 0)
 
-#define FREE_SET_DATA(set) (free(set.data), set.data = 0, set.max = 0)
+#define FREE_SET_DATA(set) if(set.data) free(set.data);                 \
+   (set.data = 0, set.max = 0)
 
 
 /* Set<struct connection *> connections; */
index 8bb79abfacc15ddd708c634b5451b3f39f2698a1..18210b8c1a4c0031e64576be9ed722271db68902 100644 (file)
@@ -168,4 +168,23 @@ kdc_insert_lookaside(krb5_data *inpkt, const krb5_fulladdr *from,
     return;
 }
 
+/* frees memory associated with the lookaside queue for memory profiling */
+void
+kdc_free_lookaside()
+{
+    register krb5_kdc_replay_ent *eptr, *last, *hold;
+    if (root_ptr.next) {
+        for (last = &root_ptr, eptr = root_ptr.next;
+            eptr; eptr = eptr->next) {
+               krb5_free_data(kdc_context, eptr->req_packet);
+               krb5_free_data(kdc_context, eptr->reply_packet);
+               krb5_free_address(kdc_context, eptr->addr);
+               hold = eptr;
+               last->next = eptr->next;
+               eptr = last;
+               free(hold);
+       }
+    }
+}
+
 #endif /* NOCACHE */
index 1ae78a176135c20a210332b743a3446b49646954..d63e92fcfe4dccaab4253c1b08130e1981f1418d 100644 (file)
@@ -85,7 +85,10 @@ main(int argc, char **argv)
        ntrans.data = 0;
 
        otrans.length = strlen(argv[1]);
-       otrans.data = (char *) malloc(otrans.length);
+       if (otrans.length) 
+         otrans.data = (char *) malloc(otrans.length);
+       else 
+         otrans.data = 0;
        memcpy(otrans.data,argv[1], otrans.length);
 
        tgs = make_princ(kdc_context, argv[2], argv[0]);
@@ -97,7 +100,8 @@ main(int argc, char **argv)
        printf("%s\n",ntrans.data);
 
        /* Free up all memory so we can profile for leaks */
-       free(otrans.data);
+       if (otrans.data)
+         free(otrans.data);
        free(ntrans.data);
 
        krb5_free_principal(kdc_realm.realm_context, tgs);