From 07ee8fd3f4f233eaadb0b1529f776d114a4c3623 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 28 May 2020 13:50:49 -0400 Subject: [PATCH] base|krb5: struct krb5_config_binding is public ea90ca86664c73fb8d415f3cc7baacdf8a6dd685 ("Move some infra bits of lib/krb5/ to lib/base/ (2)") introduced struct heim_config_binding to heimbase.h and removed the struct krb5_config_binding definition from krb5.h. It changed the krb5_config_binding typedef to be based upon the heim_config_binding typedef. These changes broke out of tree callers of krb5_config_get_list() and krb5_config_vget_list(). The internals of struct krb5_config_binding are required by callers of krb5_config_get_list() and krb5_config_vget_list() and the names must remain the same. This change restores struct krb5_config_binding to krb5.h. The structure cannot be changed because it is public and leaves struct heim_config_binding as an independent structure definition within heimbase.h. As a result struct heim_config_binding in heimbase.h must remain binary compatible until such time as krb5_config_get_list() and krb5_config_vget_list() are no longer supported. Change-Id: I69b4fda3f656cc8daa8f5fcd0c7151cee222fc8c --- lib/base/heimbase.h | 19 ++-- lib/krb5/config_file.c | 167 +++++++++++++++++++++++++----------- lib/krb5/context.c | 2 +- lib/krb5/krb5.h | 22 ++++- lib/krb5/verify_krb5_conf.c | 4 - 5 files changed, 150 insertions(+), 64 deletions(-) diff --git a/lib/base/heimbase.h b/lib/base/heimbase.h index a0141fd13..67429700d 100644 --- a/lib/base/heimbase.h +++ b/lib/base/heimbase.h @@ -120,15 +120,17 @@ struct heim_plugin_data { heim_get_instance_func_t get_instance; }; -typedef struct heim_config_binding heim_config_binding; +/* + * heim_config_binding is identical to struct krb5_config_binding + * within krb5.h. Its format is public and used by callers of + * krb5_config_get_list() and krb5_config_vget_list(). + */ +enum heim_config_type { + heim_config_string, + heim_config_list, +}; struct heim_config_binding { - enum { - heim_config_string, - heim_config_list, - /* For compatibility in krb5 code */ - krb5_config_string = heim_config_string, - krb5_config_list = heim_config_list, - } type; + enum heim_config_type type; char *name; struct heim_config_binding *next; union { @@ -137,6 +139,7 @@ struct heim_config_binding { void *generic; } u; }; +typedef struct heim_config_binding heim_config_binding; typedef struct heim_config_binding heim_config_section; /* diff --git a/lib/krb5/config_file.c b/lib/krb5/config_file.c index dc6016b60..22eff10d2 100644 --- a/lib/krb5/config_file.c +++ b/lib/krb5/config_file.c @@ -62,11 +62,20 @@ krb5_config_parse_dir_multi(krb5_context context, krb5_config_section **res) { krb5_error_code ret; + heim_config_section *section = NULL; - if ((ret = heim_config_parse_dir_multi(context->hcontext, dname, - res)) == HEIM_ERR_CONFIG_BADFORMAT) + if (res == NULL) + return EINVAL; + + *res = NULL; + + ret = heim_config_parse_dir_multi(context->hcontext, dname, §ion); + if (ret == HEIM_ERR_CONFIG_BADFORMAT) return KRB5_CONFIG_BADFORMAT; - return ret; + if (ret) + return ret; + *res = (krb5_config_section *)section; + return 0; } /** @@ -88,11 +97,20 @@ krb5_config_parse_file_multi(krb5_context context, krb5_config_section **res) { krb5_error_code ret; + heim_config_section *section = NULL; - if ((ret = heim_config_parse_file_multi(context->hcontext, fname, - res)) == HEIM_ERR_CONFIG_BADFORMAT) + if (res == NULL) + return EINVAL; + + *res = NULL; + + ret = heim_config_parse_file_multi(context->hcontext, fname, §ion); + if (ret == HEIM_ERR_CONFIG_BADFORMAT) return KRB5_CONFIG_BADFORMAT; - return ret; + if (ret) + return ret; + *res = (krb5_config_section *)section; + return 0; } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -100,7 +118,6 @@ krb5_config_parse_file(krb5_context context, const char *fname, krb5_config_section **res) { - *res = NULL; return krb5_config_parse_file_multi(context, fname, res); } @@ -120,7 +137,7 @@ krb5_config_parse_file(krb5_context context, KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free(krb5_context context, krb5_config_section *s) { - return heim_config_file_free(context->hcontext, s); + return heim_config_file_free(context->hcontext, (heim_config_section *)s); } #ifndef HEIMDAL_SMALLER @@ -128,9 +145,20 @@ krb5_config_file_free(krb5_context context, krb5_config_section *s) KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_config_copy(krb5_context context, krb5_config_section *c, - krb5_config_section **head) + krb5_config_section **res) { - return heim_config_copy(context->hcontext, c, head); + krb5_error_code ret; + heim_config_section *section = NULL; + + if (res == NULL) + return EINVAL; + + *res = NULL; + ret = heim_config_copy(context->hcontext, (heim_config_section *)c, §ion); + if (ret) + return ret; + *res = (krb5_config_section *)section; + return 0; } #endif /* HEIMDAL_SMALLER */ @@ -146,8 +174,9 @@ _krb5_config_get_next(krb5_context context, va_list args; va_start(args, type); - ret = heim_config_vget_next(context->hcontext, c ? c : context->cf, - pointer, type, args); + ret = heim_config_vget_next(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + (const heim_config_binding **)pointer, type, args); va_end(args); return ret; } @@ -159,8 +188,9 @@ _krb5_config_vget_next(krb5_context context, int type, va_list args) { - return heim_config_vget_next(context->hcontext, c ? c : context->cf, - pointer, type, args); + return heim_config_vget_next(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + (const heim_config_binding **)pointer, type, args); } KRB5_LIB_FUNCTION const void * KRB5_LIB_CALL @@ -173,7 +203,9 @@ _krb5_config_get(krb5_context context, va_list args; va_start(args, type); - ret = heim_config_vget(context->hcontext, c ? c : context->cf, type, args); + ret = heim_config_vget(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + type, args); va_end(args); return ret; } @@ -185,7 +217,9 @@ _krb5_config_vget(krb5_context context, int type, va_list args) { - return heim_config_vget(context->hcontext, c ? c : context->cf, type, args); + return heim_config_vget(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + type, args); } /** @@ -205,13 +239,15 @@ krb5_config_get_list(krb5_context context, const krb5_config_section *c, ...) { - const krb5_config_binding *ret; + const heim_config_binding *ret; va_list args; va_start(args, c); - ret = heim_config_vget_list(context->hcontext, c ? c : context->cf, args); + ret = heim_config_vget_list(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + args); va_end(args); - return ret; + return (const krb5_config_binding *)ret; } /** @@ -231,7 +267,12 @@ krb5_config_vget_list(krb5_context context, const krb5_config_section *c, va_list args) { - return heim_config_vget_list(context->hcontext, c ? c : context->cf, args); + const heim_config_binding *ret; + + ret = heim_config_vget_list(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + args); + return (const krb5_config_binding *)ret; } /** @@ -258,8 +299,9 @@ krb5_config_get_string(krb5_context context, va_list args; va_start(args, c); - ret = heim_config_vget_string(context->hcontext, c ? c : context->cf, - args); + ret = heim_config_vget_string(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + args); va_end(args); return ret; } @@ -281,8 +323,9 @@ krb5_config_vget_string(krb5_context context, const krb5_config_section *c, va_list args) { - return heim_config_vget_string(context->hcontext, c ? c : context->cf, - args); + return heim_config_vget_string(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + args); } /** @@ -307,8 +350,8 @@ krb5_config_vget_string_default(krb5_context context, va_list args) { return heim_config_vget_string_default(context->hcontext, - c ? c : context->cf, def_value, - args); + (const heim_config_section *)(c ? c : context->cf), + def_value, args); } /** @@ -337,8 +380,8 @@ krb5_config_get_string_default(krb5_context context, va_start(args, def_value); ret = heim_config_vget_string_default(context->hcontext, - c ? c : context->cf, def_value, - args); + (const heim_config_section *)(c ? c : context->cf), + def_value, args); va_end(args); return ret; } @@ -362,7 +405,8 @@ krb5_config_vget_strings(krb5_context context, va_list args) { return heim_config_vget_strings(context->hcontext, - c ? c : context->cf, args); + (const heim_config_section *)(c ? c : context->cf), + args); } /** @@ -386,7 +430,9 @@ krb5_config_get_strings(krb5_context context, va_list ap; char **ret; va_start(ap, c); - ret = heim_config_vget_strings(context->hcontext, c ? c : context->cf, ap); + ret = heim_config_vget_strings(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + ap); va_end(ap); return ret; } @@ -431,7 +477,8 @@ krb5_config_vget_bool_default(krb5_context context, va_list args) { return heim_config_vget_bool_default(context->hcontext, - c ? c : context->cf, def_value, args); + (const heim_config_section *)(c ? c : context->cf), + def_value, args); } /** @@ -453,8 +500,9 @@ krb5_config_vget_bool(krb5_context context, const krb5_config_section *c, va_list args) { - return heim_config_vget_bool_default(context->hcontext, c ? c : - context->cf, FALSE, args); + return heim_config_vget_bool_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + FALSE, args); } /** @@ -482,8 +530,9 @@ krb5_config_get_bool_default(krb5_context context, va_list ap; krb5_boolean ret; va_start(ap, def_value); - ret = heim_config_vget_bool_default(context->hcontext, c ? c : context->cf, - def_value, ap); + ret = heim_config_vget_bool_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + def_value, ap); va_end(ap); return ret; } @@ -540,8 +589,9 @@ krb5_config_vget_time_default(krb5_context context, int def_value, va_list args) { - return heim_config_vget_time_default(context->hcontext, c ? c : - context->cf, def_value, args); + return heim_config_vget_time_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + def_value, args); } /** @@ -562,7 +612,8 @@ krb5_config_vget_time(krb5_context context, va_list args) { return heim_config_vget_time_default(context->hcontext, - c ? c : context->cf, -1, args); + (const heim_config_section *)(c ? c : context->cf), + -1, args); } /** @@ -588,8 +639,9 @@ krb5_config_get_time_default(krb5_context context, va_list ap; int ret; va_start(ap, def_value); - ret = heim_config_vget_time_default(context->hcontext, c ? c : context->cf, - def_value, ap); + ret = heim_config_vget_time_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + def_value, ap); va_end(ap); return ret; } @@ -614,7 +666,9 @@ krb5_config_get_time(krb5_context context, va_list ap; int ret; va_start(ap, c); - ret = heim_config_vget_time(context->hcontext, c ? c : context->cf, ap); + ret = heim_config_vget_time(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + ap); va_end(ap); return ret; } @@ -626,8 +680,9 @@ krb5_config_vget_int_default(krb5_context context, int def_value, va_list args) { - return heim_config_vget_int_default(context->hcontext, c ? c : context->cf, - def_value, args); + return heim_config_vget_int_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + def_value, args); } KRB5_LIB_FUNCTION int KRB5_LIB_CALL @@ -635,8 +690,9 @@ krb5_config_vget_int(krb5_context context, const krb5_config_section *c, va_list args) { - return heim_config_vget_int_default(context->hcontext, c ? c : context->cf, - -1, args); + return heim_config_vget_int_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + -1, args); } KRB5_LIB_FUNCTION int KRB5_LIB_CALL @@ -648,8 +704,9 @@ krb5_config_get_int_default(krb5_context context, va_list ap; int ret; va_start(ap, def_value); - ret = heim_config_vget_int_default(context->hcontext, c ? c : context->cf, - def_value, ap); + ret = heim_config_vget_int_default(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + def_value, ap); va_end(ap); return ret; } @@ -662,7 +719,9 @@ krb5_config_get_int(krb5_context context, va_list ap; int ret; va_start(ap, c); - ret = heim_config_vget_int(context->hcontext, c ? c : context->cf, ap); + ret = heim_config_vget_int(context->hcontext, + (const heim_config_section *)(c ? c : context->cf), + ap); va_end(ap); return ret; } @@ -682,10 +741,18 @@ krb5_config_parse_string_multi(krb5_context context, KRB5_DEPRECATED_FUNCTION("Use X instead") { krb5_error_code ret; + heim_config_section *section = NULL; - ret = heim_config_parse_string_multi(context->hcontext, string, res); + if (res == NULL) + return EINVAL; + + *res = NULL; + ret = heim_config_parse_string_multi(context->hcontext, string, §ion); if (ret == HEIM_ERR_CONFIG_BADFORMAT) return KRB5_CONFIG_BADFORMAT; - return ret; + if (ret) + return ret; + *res = (krb5_config_section *)section; + return 0; } #endif diff --git a/lib/krb5/context.c b/lib/krb5/context.c index bf7c514f2..9dd9d6442 100644 --- a/lib/krb5/context.c +++ b/lib/krb5/context.c @@ -695,7 +695,7 @@ krb5_set_config_files(krb5_context context, char **filenames) &tmp))) return ret; krb5_config_file_free(context, context->cf); - context->cf = tmp; + context->cf = (krb5_config_binding *)tmp; return init_context_from_config_file(context); } diff --git a/lib/krb5/krb5.h b/lib/krb5/krb5.h index 66e9ed19e..c372bef74 100644 --- a/lib/krb5/krb5.h +++ b/lib/krb5/krb5.h @@ -534,7 +534,27 @@ typedef struct krb5_cc_ops { /* Add new functions here for versions 6 and above */ } krb5_cc_ops; -typedef struct heim_config_binding krb5_config_binding; +/* + * krb5_config_binding is identical to struct heim_config_binding + * within heimbase.h. Its format is public and used by callers of + * krb5_config_get_list() and krb5_config_vget_list(). + */ +enum krb5_config_type { + krb5_config_string, + krb5_config_list, +}; +struct krb5_config_binding { + enum krb5_config_type type; + char *name; + struct krb5_config_binding *next; + union { + char *string; + struct krb5_config_binding *list; + void *generic; + } u; +}; + +typedef struct krb5_config_binding krb5_config_binding; typedef krb5_config_binding krb5_config_section; typedef struct krb5_ticket { diff --git a/lib/krb5/verify_krb5_conf.c b/lib/krb5/verify_krb5_conf.c index 1063ecdae..e501c1a2f 100644 --- a/lib/krb5/verify_krb5_conf.c +++ b/lib/krb5/verify_krb5_conf.c @@ -37,10 +37,6 @@ #include /* verify krb5.conf */ - -#define krb5_config_string heim_config_string -#define krb5_config_list heim_config_list - static int dumpconfig_flag = 0; static int version_flag = 0; static int help_flag = 0;