Argument to create_new_ccache is a principal, not a credential cache name.

Clean up lossage related to this problem.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14730 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2005-04-04 14:17:00 +00:00
parent 44feff968e
commit 01d4d3ef29

View File

@@ -45,7 +45,7 @@ static void *cc_handle;
static cc_initialize_func init_func; static cc_initialize_func init_func;
typedef struct krb5_acc { typedef struct krb5_acc {
char *name; char *cache_name;
cc_context_t context; cc_context_t context;
cc_ccache_t ccache; cc_ccache_t ccache;
} krb5_acc; } krb5_acc;
@@ -54,8 +54,6 @@ static krb5_error_code acc_close(krb5_context, krb5_ccache);
#define ACACHE(X) ((krb5_acc *)(X)->data.data) #define ACACHE(X) ((krb5_acc *)(X)->data.data)
static const char *default_acc_name = "Initial default cache";
static const struct { static const struct {
cc_int32 error; cc_int32 error;
krb5_error_code ret; krb5_error_code ret;
@@ -319,24 +317,38 @@ fail:
return ret; return ret;
} }
static char *
get_cc_name(cc_ccache_t cache)
{
cc_string_t name;
cc_int32 error;
char *str;
error = (*cache->func->get_name)(cache, &name);
if (error)
return NULL;
str = strdup(name->data);
(*name->func->release)(name);
return str;
}
static const char* static const char*
acc_get_name(krb5_context context, acc_get_name(krb5_context context,
krb5_ccache id) krb5_ccache id)
{ {
krb5_acc *a = ACACHE(id); krb5_acc *a = ACACHE(id);
static char n[255]; static char n[255];
int32_t error; char *name;
cc_string_t name;
if (a->ccache == NULL) name = get_cc_name(a->ccache);
return default_acc_name; if (name == NULL) {
krb5_set_error_string(context, "malloc: out of memory");
error = (*a->ccache->func->get_name)(a->ccache, &name); return NULL;
if (error) }
return "unknown name"; strlcpy(n, name, sizeof(n));
free(name);
strlcpy(n, name->data, sizeof(n));
(*name->func->release)(name);
return n; return n;
} }
@@ -365,7 +377,7 @@ acc_alloc(krb5_context context, krb5_ccache *id)
return translate_cc_error(context, error); return translate_cc_error(context, error);
} }
a->name = NULL; a->cache_name = NULL;
return 0; return 0;
} }
@@ -386,13 +398,23 @@ acc_resolve(krb5_context context, krb5_ccache *id, const char *res)
if (res == NULL || res[0] == '\0') { if (res == NULL || res[0] == '\0') {
error = (*a->context->func->open_default_ccache)(a->context, error = (*a->context->func->open_default_ccache)(a->context,
&a->ccache); &a->ccache);
if (error == 0)
a->cache_name = get_cc_name(a->ccache);
} else { } else {
error = (*a->context->func->open_ccache)(a->context, res, &a->ccache); error = (*a->context->func->open_ccache)(a->context, res, &a->ccache);
if (error == 0) if (error == 0)
a->name = strdup(res); a->cache_name = strdup(res);
}
if (error != 0) {
*id = NULL;
return translate_cc_error(context, error);
}
if (a->cache_name == NULL) {
acc_close(context, *id);
*id = NULL;
krb5_set_error_string(context, "malloc: out of memory");
return ENOMEM;
} }
if (error != 0)
a->ccache = NULL;
return 0; return 0;
} }
@@ -400,30 +422,47 @@ acc_resolve(krb5_context context, krb5_ccache *id, const char *res)
static krb5_error_code static krb5_error_code
acc_gen_new(krb5_context context, krb5_ccache *id) acc_gen_new(krb5_context context, krb5_ccache *id)
{ {
krb5_principal principal;
krb5_error_code ret; krb5_error_code ret;
cc_int32 error; cc_int32 error;
krb5_acc *a; krb5_acc *a;
char *p;
ret = acc_alloc(context, id); ret = krb5_get_default_principal(context, &principal);
if (ret) if (ret)
return ret; return ret;
a = ACACHE(*id); ret = krb5_unparse_name(context, principal, &p);
krb5_free_principal(context, principal);
if (ret)
return ret;
if (a->name) ret = acc_alloc(context, id);
error = (*a->context->func->create_new_ccache)(a->context, if (ret) {
cc_credentials_v5, free(p);
a->name, &a->ccache); return ret;
else{
error = (*a->context->func->create_default_ccache)(a->context,
cc_credentials_v5,
default_acc_name,
&a->ccache);
a->name = strdup(default_acc_name);
} }
a = ACACHE(*id);
error = (*a->context->func->create_new_ccache)(a->context,
cc_credentials_v5,
p, &a->ccache);
free(p);
if (error) {
*id = NULL;
return translate_cc_error(context, error); return translate_cc_error(context, error);
} }
a->cache_name = get_cc_name(a->ccache);
if (a->cache_name == NULL) {
acc_close(context, *id);
*id = NULL;
krb5_set_error_string(context, "malloc: out of memory");
return ENOMEM;
}
printf("name: %s\n", a->cache_name);
return 0;
}
static krb5_error_code static krb5_error_code
acc_initialize(krb5_context context, acc_initialize(krb5_context context,
@@ -437,28 +476,22 @@ acc_initialize(krb5_context context,
int32_t error; int32_t error;
char *name; char *name;
if (a->ccache == NULL) { ret = krb5_unparse_name(context, primary_principal, &name);
if (ret)
return ret;
if (a->name) if (a->ccache == NULL) {
error = (*a->context->func->create_new_ccache)(a->context, error = (*a->context->func->create_new_ccache)(a->context,
cc_credentials_v5, cc_credentials_v5,
a->name, name,
&a->ccache); &a->ccache);
else{
error = (*a->context->func->create_default_ccache)(a->context,
cc_credentials_v5,
default_acc_name,
&a->ccache);
a->name = strdup(default_acc_name);
}
if (error)
return translate_cc_error(context, error);
} else { } else {
error = (*a->ccache->func->new_credentials_iterator)(a->ccache, &iter); error = (*a->ccache->func->new_credentials_iterator)(a->ccache, &iter);
if (error) if (error) {
free(name);
return translate_cc_error(context, error); return translate_cc_error(context, error);
}
while (1) { while (1) {
error = (*iter->func->next)(iter, &ccred); error = (*iter->func->next)(iter, &ccred);
@@ -468,15 +501,12 @@ acc_initialize(krb5_context context,
(*ccred->func->release)(ccred); (*ccred->func->release)(ccred);
} }
(*iter->func->release)(iter); (*iter->func->release)(iter);
}
ret = krb5_unparse_name(context, primary_principal, &name);
if (ret)
return ret;
error = (*a->ccache->func->set_principal)(a->ccache, error = (*a->ccache->func->set_principal)(a->ccache,
cc_credentials_v5, cc_credentials_v5,
name); name);
}
free(name); free(name);
return translate_cc_error(context, error); return translate_cc_error(context, error);
@@ -488,10 +518,16 @@ acc_close(krb5_context context,
{ {
krb5_acc *a = ACACHE(id); krb5_acc *a = ACACHE(id);
if (a->ccache) if (a->ccache) {
(*a->ccache->func->release)(a->ccache); (*a->ccache->func->release)(a->ccache);
a->ccache = NULL;
}
if (a->cache_name) {
free(a->cache_name);
a->cache_name = NULL;
}
(*a->context->func->release)(a->context); (*a->context->func->release)(a->context);
a->context = NULL;
krb5_data_free(&id->data); krb5_data_free(&id->data);
return 0; return 0;
} }