* svr_principal.c (kadm5_modify_principal): fix memory leak
authorBarry Jaspan <bjaspan@mit.edu>
Mon, 11 Nov 1996 22:05:18 +0000 (22:05 +0000)
committerBarry Jaspan <bjaspan@mit.edu>
Mon, 11 Nov 1996 22:05:18 +0000 (22:05 +0000)
  handling tl_data

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

src/lib/kadm5/srv/ChangeLog
src/lib/kadm5/srv/svr_principal.c

index 823576f5c23e4e6a578e9d137245583f5aea294e..032ca746c068edc6fb331925ed38fc2acf6ee53f 100644 (file)
@@ -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 @
index ecd2d2d3f851a4b56a000de1c636fd7c9a9ec0d9..f4a21f39aae2a1893035a59496c1ad0548c8b537 100644 (file)
@@ -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;