summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Jaspan <bjaspan@mit.edu>1996-11-11 22:05:18 +0000
committerBarry Jaspan <bjaspan@mit.edu>1996-11-11 22:05:18 +0000
commitd824cf54da8eded915b08f3a002cb3cdbd522ca6 (patch)
tree6421e746620f6b1a7d021a40ead4722db07fc300
parent28208a459a7c3305dd2f7b0e4076b2cd74412bee (diff)
downloadkrb5-d824cf54da8eded915b08f3a002cb3cdbd522ca6.tar.gz
krb5-d824cf54da8eded915b08f3a002cb3cdbd522ca6.tar.xz
krb5-d824cf54da8eded915b08f3a002cb3cdbd522ca6.zip
* svr_principal.c (kadm5_modify_principal): fix memory leak
handling tl_data git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@9374 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r--src/lib/kadm5/srv/ChangeLog5
-rw-r--r--src/lib/kadm5/srv/svr_principal.c25
2 files changed, 22 insertions, 8 deletions
diff --git a/src/lib/kadm5/srv/ChangeLog b/src/lib/kadm5/srv/ChangeLog
index 823576f5c2..032ca746c0 100644
--- a/src/lib/kadm5/srv/ChangeLog
+++ b/src/lib/kadm5/srv/ChangeLog
@@ -1,3 +1,8 @@
+Mon Nov 11 17:01:00 1996 Barry Jaspan <bjaspan@mit.edu>
+
+ * svr_principal.c (kadm5_modify_principal): fix memory leak
+ handling tl_data
+
Thu Nov 7 16:42:38 1996 Barry Jaspan <bjaspan@mit.edu>
* svr_iters.c (glob_to_regexp): a principal glob with no @
diff --git a/src/lib/kadm5/srv/svr_principal.c b/src/lib/kadm5/srv/svr_principal.c
index ecd2d2d3f8..f4a21f39aa 100644
--- a/src/lib/kadm5/srv/svr_principal.c
+++ b/src/lib/kadm5/srv/svr_principal.c
@@ -505,11 +505,18 @@ kadm5_modify_principal(void *server_handle,
}
if (mask & KADM5_TL_DATA) {
- krb5_tl_data *tl;
+ krb5_tl_data *tl, *tl2;
/*
* Replace kdb.tl_data with what was passed in. The
* KRB5_TL_KADM_DATA will be re-added (based on adb) by
* kdb_put_entry, below.
+ *
+ * Note that we have to duplicate the passed in tl_data
+ * before adding it to kdb. The reason is that kdb_put_entry
+ * will add its own tl_data entries that we will need to
+ * free, but we cannot free the caller's tl_data (an
+ * alternative would be to scan the tl_data after put_entry
+ * and only free those entries that were not passed in).
*/
while (kdb.tl_data) {
tl = kdb.tl_data->tl_data_next;
@@ -517,17 +524,19 @@ kadm5_modify_principal(void *server_handle,
free(kdb.tl_data);
kdb.tl_data = tl;
}
-
- kdb.tl_data = entry->tl_data;
+
kdb.n_tl_data = entry->n_tl_data;
+ kdb.tl_data = NULL;
+ tl2 = entry->tl_data;
+ while (tl2) {
+ tl = dup_tl_data(tl2);
+ tl->tl_data_next = kdb.tl_data;
+ kdb.tl_data = tl;
+ tl2 = tl2->tl_data_next;
+ }
}
ret = kdb_put_entry(handle, &kdb, &adb);
- if (mask & KADM5_TL_DATA) {
- /* prevent kdb_free_entry from freeing the caller's data */
- kdb.tl_data = NULL;
- kdb.n_tl_data = 0;
- }
if (ret) goto done;
ret = KADM5_OK;