aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEzra Peisach <epeisach@mit.edu>2003-01-03 16:28:45 +0000
committerEzra Peisach <epeisach@mit.edu>2003-01-03 16:28:45 +0000
commitf7de358516d442bd8cb8e9afb880ddeb51922bf5 (patch)
tree808ee9c5aa7e441817b5af66a1927b286bef8daa
parentd88ee5d0f84679bc05e28c6e3a80cfb57a947210 (diff)
downloadkrb5-f7de358516d442bd8cb8e9afb880ddeb51922bf5.zip
krb5-f7de358516d442bd8cb8e9afb880ddeb51922bf5.tar.gz
krb5-f7de358516d442bd8cb8e9afb880ddeb51922bf5.tar.bz2
* 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. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@15080 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r--src/kdc/ChangeLog13
-rw-r--r--src/kdc/kdc_util.h1
-rw-r--r--src/kdc/main.c15
-rw-r--r--src/kdc/network.c3
-rw-r--r--src/kdc/replay.c19
-rw-r--r--src/kdc/rtest.c8
6 files changed, 55 insertions, 4 deletions
diff --git a/src/kdc/ChangeLog b/src/kdc/ChangeLog
index 4f771c6..0e58dec 100644
--- a/src/kdc/ChangeLog
+++ b/src/kdc/ChangeLog
@@ -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
diff --git a/src/kdc/kdc_util.h b/src/kdc/kdc_util.h
index 8e48932..11a9160 100644
--- a/src/kdc/kdc_util.h
+++ b/src/kdc/kdc_util.h
@@ -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 *);
diff --git a/src/kdc/main.c b/src/kdc/main.c
index 67be475..c338b53 100644
--- a/src/kdc/main.c
+++ b/src/kdc/main.c
@@ -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;
}
diff --git a/src/kdc/network.c b/src/kdc/network.c
index 56edc40..4c49102 100644
--- a/src/kdc/network.c
+++ b/src/kdc/network.c
@@ -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; */
diff --git a/src/kdc/replay.c b/src/kdc/replay.c
index 8bb79ab..18210b8 100644
--- a/src/kdc/replay.c
+++ b/src/kdc/replay.c
@@ -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 */
diff --git a/src/kdc/rtest.c b/src/kdc/rtest.c
index 1ae78a1..d63e92f 100644
--- a/src/kdc/rtest.c
+++ b/src/kdc/rtest.c
@@ -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);