krb5_auth_context new_auth_ctx = NULL;
krb5_int32 flags_org;
+ /* Ignore the forwarded creds if the application doesn't want them. */
+ if (out_cred == NULL)
+ return 0;
+
if ((retval = krb5_auth_con_getflags(context, auth_context, &flags_org)))
return retval;
krb5_auth_con_setflags(context, auth_context,
goto cleanup;
}
+ if (creds[0] == NULL)
+ goto cleanup;
+
if ((retval = krb5_cc_new_unique(context, "MEMORY", NULL, &ccache))) {
ccache = NULL;
goto cleanup;
if ((retval = k5_cc_store_primary_cred(context, ccache, creds[0])))
goto cleanup;
- /* generate a delegated credential handle */
- if (out_cred) {
- /* allocate memory for a cred_t... */
- if (!(cred =
- (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec)))) {
- retval = ENOMEM; /* out of memory? */
- goto cleanup;
- }
+ cred = k5alloc(sizeof(*cred), &retval);
+ if (cred == NULL)
+ goto cleanup;
- /* zero it out... */
- memset(cred, 0, sizeof(krb5_gss_cred_id_rec));
+ retval = k5_mutex_init(&cred->lock);
+ if (retval)
+ goto cleanup;
- retval = k5_mutex_init(&cred->lock);
- if (retval) {
- xfree(cred);
- cred = NULL;
- goto cleanup;
- }
+ retval = kg_init_name(context, creds[0]->client, NULL, NULL, NULL, 0,
+ &cred->name);
+ if (retval) {
+ k5_mutex_destroy(&cred->lock);
+ goto cleanup;
+ }
- /* copy the client principle into it... */
- if ((retval =
- kg_init_name(context, creds[0]->client, NULL, NULL, NULL, 0,
- &cred->name))) {
- k5_mutex_destroy(&cred->lock);
- retval = ENOMEM; /* out of memory? */
- xfree(cred); /* clean up memory on failure */
- cred = NULL;
- goto cleanup;
- }
+ cred->usage = GSS_C_INITIATE;
+ cred->keytab = NULL;
+ cred->expire = creds[0]->times.endtime;
+ /* Transfer ownership of ccache to cred. */
+ cred->ccache = ccache;
+ cred->destroy_ccache = 1;
+ ccache = NULL;
- cred->usage = GSS_C_INITIATE; /* we can't accept with this */
- /* cred->name already set */
- cred->keytab = NULL; /* no keytab associated with this... */
- cred->expire = creds[0]->times.endtime; /* store the end time */
- cred->ccache = ccache; /* the ccache containing the credential */
- cred->destroy_ccache = 1;
- ccache = NULL; /* cred takes ownership so don't destroy */
- }
+ *out_cred = cred;
+ cred = NULL;
- /* If there were errors, there might have been a memory leak
- if (!cred)
- if ((retval = krb5_cc_close(context, ccache)))
- goto cleanup;
- */
cleanup:
if (creds)
krb5_free_tgt_creds(context, creds);
if (ccache)
(void)krb5_cc_destroy(context, ccache);
- if (out_cred)
- *out_cred = cred; /* return credential */
+ free(cred);
if (new_auth_ctx)
krb5_auth_con_free(context, new_auth_ctx);