krb5: refactor get_cred_kdc_capath_worker

This change adds a common out: path for all cleanup.

It also adjusts whitespace for consistency.

Change-Id: Ic90d6568a44aebc0c0adb64fad641e5420ea8e27
This commit is contained in:
Jeffrey Altman
2015-03-12 21:09:47 -04:00
parent c37f1b3e4f
commit e13c0946f6

View File

@@ -749,18 +749,22 @@ get_cred_kdc_capath_worker(krb5_context context,
krb5_creds ***ret_tgts) krb5_creds ***ret_tgts)
{ {
krb5_error_code ret; krb5_error_code ret;
krb5_creds *tgt, tmp_creds; krb5_creds *tgt = NULL;
krb5_creds tmp_creds;
krb5_const_realm client_realm, server_realm; krb5_const_realm client_realm, server_realm;
int ok_as_delegate = 1; int ok_as_delegate = 1;
*out_creds = NULL; *out_creds = calloc(1, sizeof(**out_creds));
if (*out_creds == NULL)
return krb5_enomem(context);
memset(&tmp_creds, 0, sizeof(tmp_creds));
client_realm = krb5_principal_get_realm(context, in_creds->client); client_realm = krb5_principal_get_realm(context, in_creds->client);
server_realm = krb5_principal_get_realm(context, in_creds->server); server_realm = krb5_principal_get_realm(context, in_creds->server);
memset(&tmp_creds, 0, sizeof(tmp_creds));
ret = krb5_copy_principal(context, in_creds->client, &tmp_creds.client); ret = krb5_copy_principal(context, in_creds->client, &tmp_creds.client);
if(ret) if (ret)
return ret; goto out;
ret = krb5_make_principal(context, ret = krb5_make_principal(context,
&tmp_creds.server, &tmp_creds.server,
@@ -768,55 +772,48 @@ get_cred_kdc_capath_worker(krb5_context context,
KRB5_TGS_NAME, KRB5_TGS_NAME,
server_realm, server_realm,
NULL); NULL);
if(ret){ if (ret)
krb5_free_principal(context, tmp_creds.client); goto out;
return ret;
}
{ {
krb5_creds tgts; krb5_creds tgts;
ret = find_cred(context, ccache, tmp_creds.server, ret = find_cred(context, ccache, tmp_creds.server,
*ret_tgts, &tgts); *ret_tgts, &tgts);
if(ret == 0){ if (ret == 0) {
/* only allow implicit ok_as_delegate if the realm is the clients realm */ /* only allow implicit ok_as_delegate if the realm is the clients realm */
if (strcmp(try_realm, client_realm) != 0 || strcmp(try_realm, server_realm) != 0) if (strcmp(try_realm, client_realm) != 0
|| strcmp(try_realm, server_realm) != 0) {
ok_as_delegate = tgts.flags.b.ok_as_delegate; ok_as_delegate = tgts.flags.b.ok_as_delegate;
}
*out_creds = calloc(1, sizeof(**out_creds));
if(*out_creds == NULL) {
ret = krb5_enomem(context);
} else {
ret = get_cred_kdc_address(context, ccache, flags, NULL, ret = get_cred_kdc_address(context, ccache, flags, NULL,
in_creds, &tgts, in_creds, &tgts,
impersonate_principal, impersonate_principal,
second_ticket, second_ticket,
*out_creds); *out_creds);
if (ret) { if (ret == 0 && ok_as_delegate == 0)
free (*out_creds);
*out_creds = NULL;
} else if (ok_as_delegate == 0)
(*out_creds)->flags.b.ok_as_delegate = 0; (*out_creds)->flags.b.ok_as_delegate = 0;
}
krb5_free_cred_contents(context, &tgts); krb5_free_cred_contents(context, &tgts);
krb5_free_principal(context, tmp_creds.server); goto out;
krb5_free_principal(context, tmp_creds.client);
return ret;
} }
} }
if(krb5_realm_compare(context, in_creds->client, in_creds->server))
return not_found(context, in_creds->server, KRB5_CC_NOTFOUND); if (krb5_realm_compare(context, in_creds->client, in_creds->server)) {
ret = not_found(context, in_creds->server, KRB5_CC_NOTFOUND);
goto out;
}
/* XXX this can loop forever */ /* XXX this can loop forever */
while(1){ while (1) {
heim_general_string tgt_inst; heim_general_string tgt_inst;
ret = get_cred_kdc_capath(context, flags, ccache, &tmp_creds, ret = get_cred_kdc_capath(context, flags, ccache, &tmp_creds,
NULL, NULL, &tgt, ret_tgts); NULL, NULL, &tgt, ret_tgts);
if(ret) { if (ret)
krb5_free_principal(context, tmp_creds.server); goto out;
krb5_free_principal(context, tmp_creds.client);
return ret;
}
/* /*
* if either of the chain or the ok_as_delegate was stripped * if either of the chain or the ok_as_delegate was stripped
* by the kdc, make sure we strip it too. * by the kdc, make sure we strip it too.
@@ -827,44 +824,37 @@ get_cred_kdc_capath_worker(krb5_context context,
} }
ret = add_cred(context, tgt, ret_tgts); ret = add_cred(context, tgt, ret_tgts);
if(ret) { if (ret)
krb5_free_principal(context, tmp_creds.server); goto out;
krb5_free_principal(context, tmp_creds.client);
return ret;
}
tgt_inst = tgt->server->name.name_string.val[1]; tgt_inst = tgt->server->name.name_string.val[1];
if(strcmp(tgt_inst, server_realm) == 0) if (strcmp(tgt_inst, server_realm) == 0)
break; break;
krb5_free_principal(context, tmp_creds.server); krb5_free_principal(context, tmp_creds.server);
tmp_creds.server = NULL;
ret = krb5_make_principal(context, &tmp_creds.server, ret = krb5_make_principal(context, &tmp_creds.server,
tgt_inst, KRB5_TGS_NAME, server_realm, NULL); tgt_inst, KRB5_TGS_NAME, server_realm, NULL);
if(ret) { if (ret)
krb5_free_principal(context, tmp_creds.server); goto out;
krb5_free_principal(context, tmp_creds.client);
return ret;
}
ret = krb5_free_creds(context, tgt); ret = krb5_free_creds(context, tgt);
if(ret) { tgt = NULL;
krb5_free_principal(context, tmp_creds.server); if (ret)
krb5_free_principal(context, tmp_creds.client); goto out;
return ret;
}
} }
krb5_free_principal(context, tmp_creds.server);
krb5_free_principal(context, tmp_creds.client);
*out_creds = calloc(1, sizeof(**out_creds));
if(*out_creds == NULL) {
ret = krb5_enomem(context);
} else {
ret = get_cred_kdc_address (context, ccache, flags, NULL, ret = get_cred_kdc_address (context, ccache, flags, NULL,
in_creds, tgt, impersonate_principal, in_creds, tgt, impersonate_principal,
second_ticket, *out_creds); second_ticket, *out_creds);
out:
if (ret) { if (ret) {
free (*out_creds); free (*out_creds);
*out_creds = NULL; *out_creds = NULL;
} }
} if (tmp_creds.server)
krb5_free_principal(context, tmp_creds.server);
if (tmp_creds.client)
krb5_free_principal(context, tmp_creds.client);
if (tgt)
krb5_free_creds(context, tgt); krb5_free_creds(context, tgt);
return ret; return ret;
} }