(krb5_string_to_key_derived): leak less memory
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10118 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1725,7 +1725,7 @@ ARCFOUR_subencrypt(krb5_context context,
|
|||||||
krb5_keyblock kb;
|
krb5_keyblock kb;
|
||||||
unsigned char t[4];
|
unsigned char t[4];
|
||||||
RC4_KEY rc4_key;
|
RC4_KEY rc4_key;
|
||||||
char *cdata = (char *)data;
|
unsigned char *cdata = data;
|
||||||
unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
|
unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
|
||||||
|
|
||||||
t[0] = (usage >> 0) & 0xFF;
|
t[0] = (usage >> 0) & 0xFF;
|
||||||
@@ -1781,7 +1781,7 @@ ARCFOUR_subdecrypt(krb5_context context,
|
|||||||
krb5_keyblock kb;
|
krb5_keyblock kb;
|
||||||
unsigned char t[4];
|
unsigned char t[4];
|
||||||
RC4_KEY rc4_key;
|
RC4_KEY rc4_key;
|
||||||
char *cdata = (char *)data;
|
unsigned char *cdata = data;
|
||||||
unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
|
unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
|
||||||
unsigned char cksum_data[16];
|
unsigned char cksum_data[16];
|
||||||
|
|
||||||
@@ -3000,6 +3000,7 @@ krb5_string_to_key_derived(krb5_context context,
|
|||||||
struct encryption_type *et = _find_enctype(etype);
|
struct encryption_type *et = _find_enctype(etype);
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
struct key_data kd;
|
struct key_data kd;
|
||||||
|
size_t keylen = et->keytype->bits / 8;
|
||||||
u_char *tmp;
|
u_char *tmp;
|
||||||
|
|
||||||
if(et == NULL) {
|
if(et == NULL) {
|
||||||
@@ -3008,13 +3009,28 @@ krb5_string_to_key_derived(krb5_context context,
|
|||||||
return KRB5_PROG_ETYPE_NOSUPP;
|
return KRB5_PROG_ETYPE_NOSUPP;
|
||||||
}
|
}
|
||||||
ALLOC(kd.key, 1);
|
ALLOC(kd.key, 1);
|
||||||
|
if(kd.key == NULL) {
|
||||||
|
krb5_set_error_string (context, "malloc: out of memory");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
ret = krb5_data_alloc(&kd.key->keyvalue, et->keytype->size);
|
||||||
|
if(ret) {
|
||||||
|
free(kd.key);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
kd.key->keytype = etype;
|
kd.key->keytype = etype;
|
||||||
tmp = malloc (et->keytype->bits / 8);
|
tmp = malloc (keylen);
|
||||||
_krb5_n_fold(str, len, tmp, et->keytype->bits / 8);
|
if(tmp == NULL) {
|
||||||
krb5_data_alloc(&kd.key->keyvalue, et->keytype->size);
|
krb5_free_keyblock(context, kd.key);
|
||||||
|
krb5_set_error_string (context, "malloc: out of memory");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
_krb5_n_fold(str, len, tmp, keylen);
|
||||||
kd.schedule = NULL;
|
kd.schedule = NULL;
|
||||||
DES3_postproc (context, tmp, et->keytype->bits / 8, &kd); /* XXX */
|
DES3_postproc (context, tmp, keylen, &kd); /* XXX */
|
||||||
ret = derive_key(context,
|
memset(tmp, 0, keylen);
|
||||||
|
free(tmp);
|
||||||
|
ret = derive_key(context,
|
||||||
et,
|
et,
|
||||||
&kd,
|
&kd,
|
||||||
"kerberos", /* XXX well known constant */
|
"kerberos", /* XXX well known constant */
|
||||||
|
Reference in New Issue
Block a user