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_error_code ret;
krb5_creds *tgt, tmp_creds;
krb5_creds *tgt = NULL;
krb5_creds tmp_creds;
krb5_const_realm client_realm, server_realm;
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);
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);
if(ret)
return ret;
if (ret)
goto out;
ret = krb5_make_principal(context,
&tmp_creds.server,
@@ -768,55 +772,48 @@ get_cred_kdc_capath_worker(krb5_context context,
KRB5_TGS_NAME,
server_realm,
NULL);
if(ret){
krb5_free_principal(context, tmp_creds.client);
return ret;
}
if (ret)
goto out;
{
krb5_creds tgts;
ret = find_cred(context, ccache, tmp_creds.server,
*ret_tgts, &tgts);
if(ret == 0){
if (ret == 0) {
/* 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;
}
*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,
in_creds, &tgts,
impersonate_principal,
second_ticket,
*out_creds);
if (ret) {
free (*out_creds);
*out_creds = NULL;
} else if (ok_as_delegate == 0)
if (ret == 0 && ok_as_delegate == 0)
(*out_creds)->flags.b.ok_as_delegate = 0;
}
krb5_free_cred_contents(context, &tgts);
krb5_free_principal(context, tmp_creds.server);
krb5_free_principal(context, tmp_creds.client);
return ret;
goto out;
}
}
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 */
while(1){
while (1) {
heim_general_string tgt_inst;
ret = get_cred_kdc_capath(context, flags, ccache, &tmp_creds,
NULL, NULL, &tgt, ret_tgts);
if(ret) {
krb5_free_principal(context, tmp_creds.server);
krb5_free_principal(context, tmp_creds.client);
return ret;
}
if (ret)
goto out;
/*
* if either of the chain or the ok_as_delegate was stripped
* 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);
if(ret) {
krb5_free_principal(context, tmp_creds.server);
krb5_free_principal(context, tmp_creds.client);
return ret;
}
if (ret)
goto out;
tgt_inst = tgt->server->name.name_string.val[1];
if(strcmp(tgt_inst, server_realm) == 0)
if (strcmp(tgt_inst, server_realm) == 0)
break;
krb5_free_principal(context, tmp_creds.server);
tmp_creds.server = NULL;
ret = krb5_make_principal(context, &tmp_creds.server,
tgt_inst, KRB5_TGS_NAME, server_realm, NULL);
if(ret) {
krb5_free_principal(context, tmp_creds.server);
krb5_free_principal(context, tmp_creds.client);
return ret;
}
if (ret)
goto out;
ret = krb5_free_creds(context, tgt);
if(ret) {
krb5_free_principal(context, tmp_creds.server);
krb5_free_principal(context, tmp_creds.client);
return ret;
}
tgt = NULL;
if (ret)
goto out;
}
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,
in_creds, tgt, impersonate_principal,
second_ticket, *out_creds);
out:
if (ret) {
free (*out_creds);
*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);
return ret;
}