summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>2012-04-27 22:40:21 +0000
committerTom Yu <tlyu@mit.edu>2012-04-27 22:40:21 +0000
commit5994d8928b8ff88751b14bc60c7d7bfce8b30e57 (patch)
tree46998f636593e970aedf155968925689ed509e69 /src
parent85b120f5b46ac37116117e5ebcd60424bdd87a80 (diff)
downloadkrb5-5994d8928b8ff88751b14bc60c7d7bfce8b30e57.tar.gz
krb5-5994d8928b8ff88751b14bc60c7d7bfce8b30e57.tar.xz
krb5-5994d8928b8ff88751b14bc60c7d7bfce8b30e57.zip
Use correct name-type in TGS-REQs for 2008R2 RODCs
Correctly set the name-type for the TGS principals to KRB5_NT_SRV_INST in TGS-REQs. (Previously, only AS-REQs had the name-type set in this way.) Windows Server 2008 R2 read-only domain controllers (RODCs) insist on having the correct name-type for the TGS principal in TGS-REQs as well as AS-REQs, at least for the TGT-forwarding case. Thanks to Sebastian Galiano for reporting this bug and helping with testing. ticket: 7120 target_version: 1.10.2 tags: pullup git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25839 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/lib/krb5/krb/fwd_tgt.c12
-rw-r--r--src/lib/krb5/krb/tgtname.c19
2 files changed, 19 insertions, 12 deletions
diff --git a/src/lib/krb5/krb/fwd_tgt.c b/src/lib/krb5/krb/fwd_tgt.c
index d60295203e..8387cea27e 100644
--- a/src/lib/krb5/krb/fwd_tgt.c
+++ b/src/lib/krb5/krb/fwd_tgt.c
@@ -28,6 +28,7 @@
#ifdef HAVE_MEMORY_H
#include <memory.h>
#endif
+#include "int-proto.h"
/* helper function: convert flags to necessary KDC options */
#define flags2options(flags) (flags & KDC_TKT_COMMON_MASK)
@@ -93,14 +94,9 @@ krb5_fwd_tgt_creds(krb5_context context, krb5_auth_context auth_context,
if ((retval = krb5_copy_principal(context, client, &creds.client)))
goto errout;
- if ((retval = krb5_build_principal_ext(context, &creds.server,
- client->realm.length,
- client->realm.data,
- KRB5_TGS_NAME_SIZE,
- KRB5_TGS_NAME,
- client->realm.length,
- client->realm.data,
- 0)))
+ retval = krb5int_tgtname(context, &client->realm, &client->realm,
+ &creds.server);
+ if (retval)
goto errout;
/* fetch tgt directly from cache */
diff --git a/src/lib/krb5/krb/tgtname.c b/src/lib/krb5/krb/tgtname.c
index 1a02880c6e..1cd113a1d5 100644
--- a/src/lib/krb5/krb/tgtname.c
+++ b/src/lib/krb5/krb/tgtname.c
@@ -30,8 +30,19 @@
krb5_error_code
krb5int_tgtname(krb5_context context, const krb5_data *server, const krb5_data *client, krb5_principal *tgtprinc)
{
- return krb5_build_principal_ext(context, tgtprinc, client->length, client->data,
- KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME,
- server->length, server->data,
- 0);
+ krb5_error_code ret;
+
+ ret = krb5_build_principal_ext(context, tgtprinc, client->length, client->data,
+ KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME,
+ server->length, server->data,
+ 0);
+ if (ret)
+ return ret;
+ /*
+ * Windows Server 2008 R2 RODC insists on TGS principal names having the
+ * right name type.
+ */
+ krb5_princ_type(context, *tgtprinc) = KRB5_NT_SRV_INST;
+
+ return ret;
}