diff --git a/lib/krb5/config_file.c b/lib/krb5/config_file.c index a05ab373a..00266d2d0 100644 --- a/lib/krb5/config_file.c +++ b/lib/krb5/config_file.c @@ -367,6 +367,36 @@ krb5_config_file_free (krb5_context context, krb5_config_section *s) return 0; } +krb5_error_code +_krb5_config_copy(krb5_context context, + krb5_config_section *c, + krb5_config_section **d) +{ + krb5_config_binding **previous = NULL; + + while (c) { + *d = calloc(1, sizeof(**d)); + + (*d)->name = strdup(c->name); + (*d)->type = c->type; + if ((*d)->type == krb5_config_string) + (*d)->u.string = strdup(c->u.string); + else if ((*d)->type == krb5_config_list) + krb5_config_copy (context, c->u.list, &(*d)->u.list); + else + krb5_abortx(context, + "unknown binding type (%d) in krb5_config_copy", + (*d)->type); + if (previous) + *previous = *d; + + previous = &(*d)->next; + c = c->next; + } +} + + + const void * krb5_config_get_next (krb5_context context, const krb5_config_section *c, diff --git a/lib/krb5/context.c b/lib/krb5/context.c index 8aff73edc..7ef7db5a9 100644 --- a/lib/krb5/context.c +++ b/lib/krb5/context.c @@ -349,11 +349,19 @@ krb5_copy_context(krb5_context context, krb5_context *out) p = calloc(1, sizeof(*p)); if (p == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); - goto out; + krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); + return ENOMEM; } + p->mutex = malloc(sizeof(p->mutex)); + if (p->mutex == NULL) { + krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); + free(p); + return ENOMEM; + } + HEIMDAL_MUTEX_init(context->mutex); + + if (context->default_cc_name) p->default_cc_name = strdup(context->default_cc_name); if (context->default_cc_name_env) @@ -377,7 +385,9 @@ krb5_copy_context(krb5_context context, krb5_context *out) goto out; } - p->cf = context->cf; /* XXX krb5_config_file_copy() */ + ret = _krb5_config_copy(context, context->cf, &p->cf); + if (ret) + goto out; /* XXX should copy */ krb5_init_ets(p); @@ -400,14 +410,6 @@ krb5_copy_context(krb5_context context, krb5_context *out) if (ret) goto out; - p->mutex = malloc(sizeof(p->mutex)); - if (p->mutex == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); - goto out; - } - HEIMDAL_MUTEX_init(context->mutex); - *out = p; return 0;