* kadm_rpc_xdr.c: fix memory leak handling key_data and tl_data
authorBarry Jaspan <bjaspan@mit.edu>
Mon, 11 Nov 1996 22:05:50 +0000 (22:05 +0000)
committerBarry Jaspan <bjaspan@mit.edu>
Mon, 11 Nov 1996 22:05:50 +0000 (22:05 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@9375 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/kadm5/ChangeLog
src/lib/kadm5/kadm_rpc_xdr.c

index 479d46103ae96f88cfe4a7098c686924a8023d4f..fd0d19e6643430b990566c2148505442015fa8f9 100644 (file)
@@ -1,3 +1,7 @@
+Mon Nov 11 17:01:40 1996  Barry Jaspan  <bjaspan@mit.edu>
+
+       * kadm_rpc_xdr.c: fix memory leak handling key_data and tl_data
+
 Wed Nov  6 10:20:36 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>
 
        * kadm_err.et: New error codes for KADM5_MISSING_CONF_PARAMS and 
index 478ee24c42351248225126e90025d39ef66a113b..67b94c921b572a96a179c4322e7005cafc45bbfb 100644 (file)
@@ -206,8 +206,10 @@ bool_t xdr_krb5_key_data_nocontents(XDR *xdrs, krb5_key_data *objp)
 {
      /*
       * Note that this function intentionally DOES NOT tranfer key
-      * length or contents!  xdr_krb5_key_data in adb_xdr.c does.
+      * length or contents!  xdr_krb5_key_data in adb_xdr.c does, but
+      * that is only for use within the server-side library.
       */
+     unsigned int tmp;
 
      if (xdrs->x_op == XDR_DECODE)
          memset((char *) objp, 0, sizeof(krb5_key_data));
@@ -222,10 +224,28 @@ bool_t xdr_krb5_key_data_nocontents(XDR *xdrs, krb5_key_data *objp)
          return (FALSE);
      }
      if (objp->key_data_ver > 1) {
-         if (!xdr_krb5_int16(xdrs, &objp->key_data_type[0])) {
+         if (!xdr_krb5_int16(xdrs, &objp->key_data_type[1])) {
               return (FALSE);
          }
      }
+     /*
+      * kadm5_get_principal on the server side allocates and returns
+      * key contents when asked.  Even though this function refuses to
+      * transmit that data, it still has to *free* the data at the
+      * appropriate time to avoid a memory leak.
+      */
+     if (xdrs->x_op == XDR_FREE) {
+         tmp = (unsigned int) objp->key_data_length[0];
+         if (!xdr_bytes(xdrs, (char **) &objp->key_data_contents[0],
+                        &tmp, ~0))
+              return FALSE;
+         
+         tmp = (unsigned int) objp->key_data_length[1];
+         if (!xdr_bytes(xdrs, (char **) &objp->key_data_contents[1],
+                        &tmp, ~0))
+              return FALSE;
+     }
+     
      return (TRUE);
 }
 
@@ -237,6 +257,15 @@ bool_t xdr_krb5_tl_data(XDR *xdrs, krb5_tl_data **tl_data_head)
 
      switch (xdrs->x_op) {
      case XDR_FREE:
+         tl = tl2 = *tl_data_head;
+         while (tl) {
+              tl2 = tl->tl_data_next;
+              free(tl->tl_data_contents);
+              free(tl);
+              tl = tl2;
+         }
+         break;
+         
      case XDR_ENCODE:
          tl = *tl_data_head;
          while (1) {