(gss_krb5_import_ccache): Instead of making a copy of the ccache, make
a reference by getting the name and resolving the name. This way the cache is shared, this flipp side is of course that if someone calls krb5_cc_destroy the cache is lost for everyone. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16267 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -108,37 +108,44 @@ gss_krb5_import_ccache(OM_uint32 *minor_status,
|
||||
ret = gss_add_oid_set_member(minor_status, GSS_KRB5_MECHANISM,
|
||||
&handle->mechanisms);
|
||||
if (ret != GSS_S_COMPLETE) {
|
||||
gssapi_krb5_set_error_string ();
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
|
||||
kret = krb5_cc_gen_new(gssapi_krb5_context,
|
||||
&krb5_mcc_ops,
|
||||
&handle->ccache);
|
||||
if (kret) {
|
||||
gssapi_krb5_set_error_string ();
|
||||
gss_release_oid_set(NULL, &handle->mechanisms);
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
{
|
||||
const char *type, *name;
|
||||
char *str;
|
||||
|
||||
type = krb5_cc_get_type(gssapi_krb5_context, in);
|
||||
name = krb5_cc_get_name(gssapi_krb5_context, in);
|
||||
|
||||
if (asprintf(&str, "%s:%s", type, name) == -1) {
|
||||
krb5_set_error_string(gssapi_krb5_context,
|
||||
"malloc - out of memory");
|
||||
kret = ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
kret = krb5_cc_resolve(gssapi_krb5_context, str, &handle->ccache);
|
||||
free(str);
|
||||
if (kret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
kret = krb5_cc_copy_cache(gssapi_krb5_context, in, handle->ccache);
|
||||
if (kret) {
|
||||
gssapi_krb5_set_error_string ();
|
||||
gss_release_oid_set(NULL, &handle->mechanisms);
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
*minor_status = 0;
|
||||
*cred = handle;
|
||||
return GSS_S_COMPLETE;
|
||||
|
||||
out:
|
||||
gssapi_krb5_set_error_string ();
|
||||
if (handle->principal)
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -108,37 +108,44 @@ gss_krb5_import_ccache(OM_uint32 *minor_status,
|
||||
ret = gss_add_oid_set_member(minor_status, GSS_KRB5_MECHANISM,
|
||||
&handle->mechanisms);
|
||||
if (ret != GSS_S_COMPLETE) {
|
||||
gssapi_krb5_set_error_string ();
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
|
||||
kret = krb5_cc_gen_new(gssapi_krb5_context,
|
||||
&krb5_mcc_ops,
|
||||
&handle->ccache);
|
||||
if (kret) {
|
||||
gssapi_krb5_set_error_string ();
|
||||
gss_release_oid_set(NULL, &handle->mechanisms);
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
{
|
||||
const char *type, *name;
|
||||
char *str;
|
||||
|
||||
type = krb5_cc_get_type(gssapi_krb5_context, in);
|
||||
name = krb5_cc_get_name(gssapi_krb5_context, in);
|
||||
|
||||
if (asprintf(&str, "%s:%s", type, name) == -1) {
|
||||
krb5_set_error_string(gssapi_krb5_context,
|
||||
"malloc - out of memory");
|
||||
kret = ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
kret = krb5_cc_resolve(gssapi_krb5_context, str, &handle->ccache);
|
||||
free(str);
|
||||
if (kret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
kret = krb5_cc_copy_cache(gssapi_krb5_context, in, handle->ccache);
|
||||
if (kret) {
|
||||
gssapi_krb5_set_error_string ();
|
||||
gss_release_oid_set(NULL, &handle->mechanisms);
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
*minor_status = 0;
|
||||
*cred = handle;
|
||||
return GSS_S_COMPLETE;
|
||||
|
||||
out:
|
||||
gssapi_krb5_set_error_string ();
|
||||
if (handle->principal)
|
||||
krb5_free_principal(gssapi_krb5_context, handle->principal);
|
||||
HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex);
|
||||
free(handle);
|
||||
*minor_status = kret;
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user