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:
		| @@ -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,81 +554,80 @@ 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; | ||||||
|  |     p->etypes = NULL; | ||||||
|  |     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; |         ret = ENOMEM; | ||||||
|         goto out; |  | ||||||
|  |     if (ret == 0) { | ||||||
|  |         heim_context_set_log_utc(p->hcontext, context->log_utc); | ||||||
|  |         ret = _krb5_config_copy(context, context->cf, &p->cf); | ||||||
|  |     } | ||||||
|  |     if (ret == 0) | ||||||
|  |         ret = init_context_from_config_file(p); | ||||||
|  |     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; | ||||||
|  |     } | ||||||
|  |     if (ret == 0 && context->default_cc_name_env) { | ||||||
|  |         free(p->default_cc_name_env); | ||||||
|  |         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; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     heim_context_set_log_utc(p->hcontext, context->log_utc); |     if (ret == 0 && context->etypes) { | ||||||
|  |         free(p->etypes); | ||||||
|     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 && |  | ||||||
| 	(p->default_cc_name_env = |  | ||||||
|             strdup(context->default_cc_name_env)) == NULL) { |  | ||||||
|         ret = ENOMEM; |  | ||||||
|         goto out; |  | ||||||
|     } |  | ||||||
|     if (context->configured_default_cc_name && |  | ||||||
| 	(p->configured_default_cc_name = |  | ||||||
|             strdup(context->configured_default_cc_name)) == NULL) { |  | ||||||
|         ret = ENOMEM; |  | ||||||
|         goto out; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (context->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 */ | ||||||
|     _krb5_init_ets(p); |     if (ret == 0) | ||||||
|  |         _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); | ||||||
|  |     if (ret == 0) | ||||||
|  |         ret = krb5_set_extra_addresses(p, context->ignore_addresses); | ||||||
|  |     if (ret == 0) | ||||||
|  |         ret = _krb5_copy_send_to_kdc_func(p, context); | ||||||
|  |  | ||||||
|     ret = krb5_set_extra_addresses(p, context->extra_addresses); |     if (ret == 0) | ||||||
|     if (ret) |         *out = p; | ||||||
| 	goto out; |     else | ||||||
|     ret = krb5_set_extra_addresses(p, context->ignore_addresses); |         krb5_free_context(p); | ||||||
|     if (ret) |  | ||||||
| 	goto out; |  | ||||||
|  |  | ||||||
|     ret = _krb5_copy_send_to_kdc_func(p, context); |  | ||||||
|     if (ret) |  | ||||||
| 	goto out; |  | ||||||
|  |  | ||||||
|     *out = p; |  | ||||||
|  |  | ||||||
|     return 0; |  | ||||||
|  |  | ||||||
|  out: |  | ||||||
|     krb5_free_context(p); |  | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicolas Williams
					Nicolas Williams