From: Alan T. DeKok Date: Tue, 5 Nov 2019 16:57:55 +0000 (-0500) Subject: add and use fr_dict_coerce() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0acbbca3c43c1cad261035d426728d57374e9d61;p=thirdparty%2Ffreeradius-server.git add and use fr_dict_coerce() to allow adding attributes to dicts at run time --- diff --git a/src/bin/radclient.c b/src/bin/radclient.c index 0d7e0e7a85b..903dbeda965 100644 --- a/src/bin/radclient.c +++ b/src/bin/radclient.c @@ -1390,7 +1390,7 @@ int main(int argc, char **argv) return 1; } - if (fr_dict_read(dict_freeradius, raddb_dir, FR_DICTIONARY_FILE) == -1) { + if (fr_dict_read(fr_dict_coerce(dict_freeradius), raddb_dir, FR_DICTIONARY_FILE) == -1) { fr_log_perror(&default_log, L_ERR, __FILE__, __LINE__, "Failed to initialize the dictionaries"); return 1; } diff --git a/src/bin/radsniff.c b/src/bin/radsniff.c index 6008eec31aa..fd3bf25b27b 100644 --- a/src/bin/radsniff.c +++ b/src/bin/radsniff.c @@ -2578,7 +2578,7 @@ int main(int argc, char *argv[]) goto finish; } - if (fr_dict_read(dict_freeradius, raddb_dir, FR_DICTIONARY_FILE) == -1) { + if (fr_dict_read(fr_dict_coerce(dict_freeradius), raddb_dir, FR_DICTIONARY_FILE) == -1) { fr_perror("radsniff"); ret = 64; goto finish; diff --git a/src/bin/radsnmp.c b/src/bin/radsnmp.c index 7883056ea49..26759c9249d 100644 --- a/src/bin/radsnmp.c +++ b/src/bin/radsnmp.c @@ -92,8 +92,8 @@ typedef struct { char *secret; //!< Shared secret. } radsnmp_conf_t; -static fr_dict_t *dict_freeradius; -static fr_dict_t *dict_radius; +static fr_dict_t const *dict_freeradius; +static fr_dict_t const *dict_radius; extern fr_dict_autoload_t radsnmp_dict[]; fr_dict_autoload_t radsnmp_dict[] = { @@ -1035,7 +1035,7 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } - if (fr_dict_read(dict_freeradius, conf->raddb_dir, FR_DICTIONARY_FILE) == -1) { + if (fr_dict_read(fr_dict_coerce(dict_freeradius), conf->raddb_dir, FR_DICTIONARY_FILE) == -1) { fr_perror("radsnmp"); exit(EXIT_FAILURE); } diff --git a/src/lib/util/dict.h b/src/lib/util/dict.h index 02716ed05dc..5d249867e0e 100644 --- a/src/lib/util/dict.h +++ b/src/lib/util/dict.h @@ -429,6 +429,8 @@ void fr_dict_free(fr_dict_t **dict); int fr_dict_global_init(TALLOC_CTX *ctx, char const *dict_dir); int fr_dict_dir_set(char const *dict_dir); + +fr_dict_t *fr_dict_coerce(fr_dict_t const *dict); /** @} */ /** @name Dictionary testing and validation diff --git a/src/lib/util/dict_util.c b/src/lib/util/dict_util.c index a7fe0854fa6..aef61f35eda 100644 --- a/src/lib/util/dict_util.c +++ b/src/lib/util/dict_util.c @@ -2359,7 +2359,7 @@ void fr_dict_autofree(fr_dict_autoload_t const *to_free) fr_dict_autoload_t const *p; for (p = to_free; p->out; p++) { - dict = p->out; + memcpy(&dict, &p->out, sizeof(dict)); /* const issues */ if (!*dict) continue; fr_dict_free(dict); @@ -2684,3 +2684,13 @@ fr_dict_attr_t const *fr_dict_attr_iterate_children(fr_dict_attr_t const *parent return NULL; } +/** Coerce to non-const + * + */ +fr_dict_t *fr_dict_coerce(fr_dict_t const *dict) +{ + fr_dict_t *mutable; + + memcpy(&mutable, &dict, sizeof(dict)); + return mutable; +} diff --git a/src/modules/proto_dhcpv4/dhcpclient.c b/src/modules/proto_dhcpv4/dhcpclient.c index d39713a0c06..fb8936c890e 100644 --- a/src/modules/proto_dhcpv4/dhcpclient.c +++ b/src/modules/proto_dhcpv4/dhcpclient.c @@ -677,7 +677,7 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } - if (fr_dict_read(dict_freeradius, raddb_dir, FR_DICTIONARY_FILE) == -1) { + if (fr_dict_read(fr_dict_coerce(dict_freeradius), raddb_dir, FR_DICTIONARY_FILE) == -1) { fr_perror("dhcpclient"); exit(EXIT_FAILURE); } diff --git a/src/modules/rlm_isc_dhcp/rlm_isc_dhcp.c b/src/modules/rlm_isc_dhcp/rlm_isc_dhcp.c index c39b287847b..13155ad1378 100644 --- a/src/modules/rlm_isc_dhcp/rlm_isc_dhcp.c +++ b/src/modules/rlm_isc_dhcp/rlm_isc_dhcp.c @@ -982,7 +982,7 @@ static int parse_option_definition(rlm_isc_dhcp_info_t *parent, rlm_isc_dhcp_tok * name/code checks above. But doing so allows us to * have better error messages. */ - rcode = fr_dict_attr_add(dict_dhcpv4, root, name, box.vb_uint32, type, &flags); + rcode = fr_dict_attr_add(fr_dict_coerce(dict_dhcpv4), root, name, box.vb_uint32, type, &flags); talloc_free(name); if (rcode < 0) return rcode; diff --git a/src/modules/rlm_ldap/rlm_ldap.c b/src/modules/rlm_ldap/rlm_ldap.c index 0afe8dc0d6f..53ff574af2e 100644 --- a/src/modules/rlm_ldap/rlm_ldap.c +++ b/src/modules/rlm_ldap/rlm_ldap.c @@ -1501,7 +1501,7 @@ static int mod_bootstrap(void *instance, CONF_SECTION *conf) fr_dict_attr_flags_t flags; memset(&flags, 0, sizeof(flags)); - if (fr_dict_attr_add(dict_freeradius, fr_dict_root(dict_freeradius), + if (fr_dict_attr_add(fr_dict_coerce(dict_freeradius), fr_dict_root(dict_freeradius), inst->cache_attribute, -1, FR_TYPE_STRING, &flags) < 0) { PERROR("Error creating cache attribute"); error: diff --git a/src/modules/rlm_sqlcounter/rlm_sqlcounter.c b/src/modules/rlm_sqlcounter/rlm_sqlcounter.c index 9660321da9f..eba7fa37807 100644 --- a/src/modules/rlm_sqlcounter/rlm_sqlcounter.c +++ b/src/modules/rlm_sqlcounter/rlm_sqlcounter.c @@ -572,12 +572,12 @@ static int mod_bootstrap(void *instance, CONF_SECTION *conf) rad_assert(inst->limit_attr); memset(&flags, 0, sizeof(flags)); - if (tmpl_define_undefined_attr(dict_freeradius, inst->paircmp_attr, FR_TYPE_UINT64, &flags) < 0) { + if (tmpl_define_undefined_attr(fr_dict_coerce(dict_freeradius), inst->paircmp_attr, FR_TYPE_UINT64, &flags) < 0) { cf_log_perr(conf, "Failed defining counter attribute"); return -1; } - if (tmpl_define_undefined_attr(dict_freeradius, inst->limit_attr, FR_TYPE_UINT64, &flags) < 0) { + if (tmpl_define_undefined_attr(fr_dict_coerce(dict_freeradius), inst->limit_attr, FR_TYPE_UINT64, &flags) < 0) { cf_log_perr(conf, "Failed defining check attribute"); return -1; }