krb5: Fix skew bug, or krb5_copy_context() moar

Now that we use krb5_copy_context() via kadm5_c_dup_context(), we see
occasional skew errors in the tests because context->max_skew was not
being initialized, so it was set to 0s of skew, and krb5_rd_priv() or
others could fail.
This commit is contained in:
Nicolas Williams
2022-03-24 16:38:17 -05:00
parent d5e21b7771
commit d1e7650988

View File

@@ -545,7 +545,7 @@ copy_etypes (krb5_context context,
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_copy_context(krb5_context context, krb5_context *out) krb5_copy_context(krb5_context context, krb5_context *out)
{ {
krb5_error_code ret; krb5_error_code ret = 0;
krb5_context p; krb5_context p;
*out = NULL; *out = NULL;
@@ -554,80 +554,79 @@ krb5_copy_context(krb5_context context, krb5_context *out)
if (p == NULL) if (p == NULL)
return krb5_enomem(context); return krb5_enomem(context);
if ((p->hcontext = heim_context_init()) == NULL) { p->cc_ops = NULL;
ret = ENOMEM; p->etypes = NULL;
goto out; p->kt_types = NULL;
} p->cfg_etypes = NULL;
p->etypes_des = NULL;
p->default_realms = NULL;
p->extra_addresses = NULL;
p->ignore_addresses = NULL;
if ((p->hcontext = heim_context_init()) == NULL)
ret = ENOMEM;
if (ret == 0) {
heim_context_set_log_utc(p->hcontext, context->log_utc); heim_context_set_log_utc(p->hcontext, context->log_utc);
ret = _krb5_config_copy(context, context->cf, &p->cf);
if (context->default_cc_name &&
(p->default_cc_name = strdup(context->default_cc_name)) == NULL) {
ret = ENOMEM;
goto out;
} }
if (context->default_cc_name_env && if (ret == 0)
(p->default_cc_name_env = ret = init_context_from_config_file(p);
strdup(context->default_cc_name_env)) == NULL) { if (ret == 0 && context->default_cc_name) {
free(p->default_cc_name);
if ((p->default_cc_name = strdup(context->default_cc_name)) == NULL)
ret = ENOMEM; ret = ENOMEM;
goto out;
} }
if (context->configured_default_cc_name && if (ret == 0 && context->default_cc_name_env) {
(p->configured_default_cc_name = free(p->default_cc_name_env);
strdup(context->configured_default_cc_name)) == NULL) { if ((p->default_cc_name_env =
strdup(context->default_cc_name_env)) == NULL)
ret = ENOMEM;
}
if (ret == 0 && context->configured_default_cc_name) {
free(context->configured_default_cc_name);
if ((p->configured_default_cc_name =
strdup(context->configured_default_cc_name)) == NULL)
ret = ENOMEM; ret = ENOMEM;
goto out;
} }
if (context->etypes) { if (ret == 0 && context->etypes) {
free(p->etypes);
ret = copy_etypes(context, context->etypes, &p->etypes); ret = copy_etypes(context, context->etypes, &p->etypes);
if (ret)
goto out;
} }
if (context->cfg_etypes) { if (ret == 0 && context->cfg_etypes) {
free(p->cfg_etypes);
ret = copy_etypes(context, context->cfg_etypes, &p->cfg_etypes); ret = copy_etypes(context, context->cfg_etypes, &p->cfg_etypes);
if (ret)
goto out;
} }
if (context->etypes_des) { if (ret == 0 && context->etypes_des) {
free(p->etypes_des);
ret = copy_etypes(context, context->etypes_des, &p->etypes_des); ret = copy_etypes(context, context->etypes_des, &p->etypes_des);
if (ret)
goto out;
} }
if (context->default_realms) { if (ret == 0 && context->default_realms) {
krb5_free_host_realm(context, p->default_realms);
ret = krb5_copy_host_realm(context, ret = krb5_copy_host_realm(context,
context->default_realms, &p->default_realms); context->default_realms, &p->default_realms);
if (ret)
goto out;
} }
ret = _krb5_config_copy(context, context->cf, &p->cf);
if (ret)
goto out;
/* XXX should copy */ /* XXX should copy */
if (ret == 0)
_krb5_init_ets(p); _krb5_init_ets(p);
cc_ops_copy(p, context); if (ret == 0)
kt_ops_copy(p, context); ret = cc_ops_copy(p, context);
if (ret == 0)
ret = kt_ops_copy(p, context);
if (ret == 0)
ret = krb5_set_extra_addresses(p, context->extra_addresses); ret = krb5_set_extra_addresses(p, context->extra_addresses);
if (ret) if (ret == 0)
goto out;
ret = krb5_set_extra_addresses(p, context->ignore_addresses); ret = krb5_set_extra_addresses(p, context->ignore_addresses);
if (ret) if (ret == 0)
goto out;
ret = _krb5_copy_send_to_kdc_func(p, context); ret = _krb5_copy_send_to_kdc_func(p, context);
if (ret)
goto out;
if (ret == 0)
*out = p; *out = p;
else
return 0;
out:
krb5_free_context(p); krb5_free_context(p);
return ret; return ret;
} }