svn rev #21672: branches/mskrb-integ/src/lib/krb5/krb/

lhoward@MIT.EDU lhoward at MIT.EDU
Fri Jan 2 18:54:02 EST 2009


http://src.mit.edu/fisheye/changelog/krb5/?cs=21672
Commit By: lhoward
Log Message:
Handle KDC_ERR_WRONG_REALM in krb5_get_in_tkt() - needs review, not
completely tested yet



Changed Files:
U   branches/mskrb-integ/src/lib/krb5/krb/get_in_tkt.c
Modified: branches/mskrb-integ/src/lib/krb5/krb/get_in_tkt.c
===================================================================
--- branches/mskrb-integ/src/lib/krb5/krb/get_in_tkt.c	2009-01-02 22:48:16 UTC (rev 21671)
+++ branches/mskrb-integ/src/lib/krb5/krb/get_in_tkt.c	2009-01-02 23:53:55 UTC (rev 21672)
@@ -671,8 +671,12 @@
 	    } else if (canon_flag && err_reply->error == KDC_ERR_WRONG_REALM) {
 		if (++referral_count > KRB5_REFERRAL_MAXHOPS ||
 		    err_reply->client == NULL ||
-		    err_reply->client->realm.length == 0)
+		    err_reply->client->realm.length == 0) {
+		    retval = (krb5_error_code) err_reply->error +
+			ERROR_TABLE_BASE_krb5;
+		    krb5_free_error(context, err_reply);
 		    goto cleanup;
+		}
 		/* Rewrite request.client with realm from error reply */
 		if (referred_client.realm.data) {
 		    krb5_free_data_contents(context, &referred_client.realm);
@@ -970,6 +974,8 @@
     krb5_timestamp time_now;
     krb5_enctype etype = 0;
     krb5_preauth_client_rock get_data_rock;
+    int canon_flag = 0;
+    krb5_principal_data referred_client;
 
     /* initialize everything which will be freed at cleanup */
 
@@ -994,6 +1000,11 @@
     
     err_reply = NULL;
 
+    /* referred_client is used to rewrite the client realm for referrals */
+    referred_client = *client;
+    referred_client.realm.data = NULL;
+    referred_client.realm.length = 0;
+
     /*
      * Set up the basic request structure
      */
@@ -1103,6 +1114,10 @@
 
     request.client = client;
 
+    /* per referrals draft, enterprise principals imply canonicalization */
+    canon_flag = ((request.kdc_options & KDC_OPT_CANONICALIZE) != 0) ||
+	client->type == KRB5_NT_ENTERPRISE_PRINCIPAL;
+
     /* service */
     
     if (in_tkt_service) {
@@ -1311,6 +1326,26 @@
 		if (ret)
 		    goto cleanup;
 		/* continue to next iteration */
+	    } else if (canon_flag && err_reply->error == KDC_ERR_WRONG_REALM) {
+		if (err_reply->client == NULL ||
+		    err_reply->client->realm.length == 0) {
+		    ret = (krb5_error_code) err_reply->error
+		          + ERROR_TABLE_BASE_krb5;
+		    krb5_free_error(context, err_reply);
+		    goto cleanup;
+		}
+		/* Rewrite request.client with realm from error reply */
+		if (referred_client.realm.data) {
+		    krb5_free_data_contents(context, &referred_client.realm);
+		    referred_client.realm.data = NULL;
+		}
+		ret = krb5int_copy_data_contents(context,
+						 &err_reply->client->realm,
+						 &referred_client.realm);
+		krb5_free_error(context, err_reply);
+		if (ret)
+		    goto cleanup;
+		request.client = &referred_client;
 	    } else {
 		if (err_reply->e_data.length > 0) {
 		    /* continue to next iteration */
@@ -1461,6 +1496,8 @@
 	*as_reply = local_as_reply;
     else if (local_as_reply)
 	krb5_free_kdc_rep(context, local_as_reply);
+    if (referred_client.realm.data)
+	krb5_free_data_contents(context, &referred_client.realm);
 
     return(ret);
 }




More information about the cvs-krb5 mailing list