summaryrefslogtreecommitdiffstats
path: root/src/lib/gssapi/krb5/util_cksum.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/gssapi/krb5/util_cksum.c')
-rw-r--r--src/lib/gssapi/krb5/util_cksum.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/lib/gssapi/krb5/util_cksum.c b/src/lib/gssapi/krb5/util_cksum.c
index 316f41beef..235d749473 100644
--- a/src/lib/gssapi/krb5/util_cksum.c
+++ b/src/lib/gssapi/krb5/util_cksum.c
@@ -34,10 +34,12 @@ kg_checksum_channel_bindings(context, cb, cksum, bigend)
int bigend;
{
size_t len;
- char *buf, *ptr;
+ char *buf = 0;
+ char *ptr;
size_t sumlen;
krb5_data plaind;
krb5_error_code code;
+ void *temp;
/* initialize the the cksum */
code = krb5_c_checksum_length(context, CKSUMTYPE_RSA_MD5, &sumlen);
@@ -85,13 +87,22 @@ kg_checksum_channel_bindings(context, cb, cksum, bigend)
code = krb5_c_make_checksum(context, CKSUMTYPE_RSA_MD5, 0, 0,
&plaind, cksum);
- if (code) {
- xfree(buf);
- return(code);
+ if (code)
+ goto cleanup;
+
+ if ((temp = xmalloc(cksum->length)) == NULL) {
+ krb5_free_checksum_contents(context, cksum);
+ code = ENOMEM;
+ goto cleanup;
}
- /* success */
+ memcpy(temp, cksum->contents, cksum->length);
+ krb5_free_checksum_contents(context, cksum);
+ cksum->contents = (krb5_octet *)temp;
- xfree(buf);
- return(0);
+ /* success */
+ cleanup:
+ if (buf)
+ xfree(buf);
+ return code;
}