krb5int_derive_key results in cache with uninitialized values
authorEzra Peisach <epeisach@mit.edu>
Fri, 8 Jan 2010 01:51:19 +0000 (01:51 +0000)
committerEzra Peisach <epeisach@mit.edu>
Fri, 8 Jan 2010 01:51:19 +0000 (01:51 +0000)
krb5int_derive_key creates a temporary keyblock to add to the derived cache.
krb5_k_free_key will iterate over the derived keys and for ones with cache will
lookup the enctype for the key_cleanup handler.

Unfortunatly, there isn't a keyblock init function that does not allocate the
keyblock - as I suspect this problem will appear in other places.

The valgrind log of this problem is:

==7281== Conditional jump or move depends on uninitialised value(s)
==7281==    at 0x40E9AE8: find_enctype (etypes.h:81)
==7281==    by 0x40E9C96: krb5_k_free_key (key.c:91)
==7281==    by 0x40E9C52: krb5_k_free_key (key.c:86)
==7281==    by 0x40EBB00: krb5_c_prf (prf.c:87)
==7281==    by 0x40E7B1B: prf_plus (cf2.c:77)
==7281==    by 0x40E7CE6: krb5_c_fx_cf2_simple (cf2.c:125)
==7281==    by 0x804899C: main (t_cf2.c:70)
==7281==

with memory leaks.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@23608 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/crypto/krb/dk/derive.c

index 384a5e400ff80449232169a0b735398ab1352f3b..5fd8876479982078caf79ca6a7e4f00f87f15067 100644 (file)
@@ -183,6 +183,10 @@ krb5int_derive_key(const struct krb5_enc_provider *enc,
     /* Derive into a temporary keyblock. */
     keyblock.length = enc->keylength;
     keyblock.contents = malloc(keyblock.length);
+    /* Set the enctype as the krb5_k_free_key will iterate over list
+       or derived keys and invoke krb5_k_free_key which will lookup
+       the enctype for key_cleanup handler */
+    keyblock.enctype = inkey->keyblock.enctype;
     if (keyblock.contents == NULL)
         return ENOMEM;
     ret = krb5int_derive_keyblock(enc, inkey, &keyblock, in_constant);