From: Barry Jaspan Date: Mon, 11 Nov 1996 22:05:50 +0000 (+0000) Subject: * kadm_rpc_xdr.c: fix memory leak handling key_data and tl_data X-Git-Tag: krb5-1.0-freeze1~54 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=8c0c464384bfea8f1c62c4f2750b9d26740370a1;p=krb5.git * kadm_rpc_xdr.c: fix memory leak handling key_data and tl_data git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@9375 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/lib/kadm5/ChangeLog b/src/lib/kadm5/ChangeLog index 479d46103..fd0d19e66 100644 --- a/src/lib/kadm5/ChangeLog +++ b/src/lib/kadm5/ChangeLog @@ -1,3 +1,7 @@ +Mon Nov 11 17:01:40 1996 Barry Jaspan + + * kadm_rpc_xdr.c: fix memory leak handling key_data and tl_data + Wed Nov 6 10:20:36 1996 Theodore Ts'o * kadm_err.et: New error codes for KADM5_MISSING_CONF_PARAMS and diff --git a/src/lib/kadm5/kadm_rpc_xdr.c b/src/lib/kadm5/kadm_rpc_xdr.c index 478ee24c4..67b94c921 100644 --- a/src/lib/kadm5/kadm_rpc_xdr.c +++ b/src/lib/kadm5/kadm_rpc_xdr.c @@ -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) {