+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
{
/*
* 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));
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);
}
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) {