diff options
Diffstat (limited to 'src/lib/gssapi/krb5/util_cksum.c')
-rw-r--r-- | src/lib/gssapi/krb5/util_cksum.c | 25 |
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; } |