--- source3/client/cifs.upcall.c.orig 2009-10-29 08:47:16.000000000 +0100 +++ source3/client/cifs.upcall.c.orig 2009-11-03 10:52:37.000000000 +0100 @@ -31,6 +31,9 @@ #include "cifs_spnego.h" +// defined in heimdal appl/dceutils/k5dce.h +#define KRB5_TC_OPENCLOSE 0x00000001 + #define CIFS_DEFAULT_KRB5_DIR "/tmp" #define CIFS_DEFAULT_KRB5_PREFIX "krb5cc_" @@ -45,14 +48,24 @@ } sectype_t; static inline int -k5_data_equal(krb5_data d1, krb5_data d2, unsigned int length) +k5_realm_equal(Realm d1, Realm d2) +{ + int len1 = length_Realm(&d1); + int len2 = length_Realm(&d2); + + return (len1 == len2 && + memcmp(d1, d2, len1) == 0); +} + +static inline int +k5_name_equal(PrincipalName d1, krb5_data d2, unsigned int length) { if (!length) - length = d1.length; + length = d1.name_string.len; - return (d1.length == length && - d1.length == d2.length && - memcmp(d1.data, d2.data, length) == 0); + return (d1.name_string.len == length && + d1.name_string.len == d2.length && + memcmp(d1.name_string.val, d2.data, length) == 0); } @@ -94,9 +107,9 @@ } while (!credtime && !krb5_cc_next_cred(context, ccache, &cur, &creds)) { - if (k5_data_equal(creds.server->realm, principal->realm, 0) && - k5_data_equal(creds.server->data[0], tgt, tgt.length) && - k5_data_equal(creds.server->data[1], principal->realm, 0) && + + if (k5_realm_equal(creds.server->realm, principal->realm) && + k5_name_equal(creds.server->name, tgt, tgt.length) && creds.times.endtime > time(NULL)) credtime = creds.times.endtime; krb5_free_cred_contents(context, &creds);