From: Alan T. DeKok Date: Fri, 26 Jan 2024 21:14:53 +0000 (-0500) Subject: add init/free to fr_dict_protocol_t X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecece4fbe94da57cee0d0e0aaaa201ed4e651685;p=thirdparty%2Ffreeradius-server.git add init/free to fr_dict_protocol_t and call them for autoref dictionaries --- diff --git a/src/lib/util/dict.h b/src/lib/util/dict.h index d7c2aa635c3..0ad1bda348c 100644 --- a/src/lib/util/dict.h +++ b/src/lib/util/dict.h @@ -327,6 +327,14 @@ typedef ssize_t (*fr_dict_attr_decode_func_t)(TALLOC_CTX *ctx, fr_pair_list_t *v */ typedef ssize_t(*fr_dict_attr_encode_func_t)(fr_dbuff_t *dbuff, fr_pair_list_t const *vps); +/** Init / free callbacks + * + * Only for "autoref" usage. + */ +typedef int (*fr_dict_protocol_init_t)(void); +typedef void (*fr_dict_protocol_free_t)(void); + + /** Protocol-specific callbacks in libfreeradius-PROTOCOL * */ @@ -337,6 +345,10 @@ typedef struct { fr_table_num_ordered_t const *subtype_table; //!< for "encrypt=1", etc. size_t subtype_table_len; //!< length of subtype_table fr_dict_attr_valid_func_t attr_valid; //!< validation function for new attributes + + fr_dict_protocol_init_t init; //!< initialize the library + fr_dict_protocol_free_t free; //!< free the library + fr_dict_attr_decode_func_t decode; //!< for decoding attributes fr_dict_attr_encode_func_t encode; //!< for encoding attributes } fr_dict_protocol_t; diff --git a/src/lib/util/dict_fixup.c b/src/lib/util/dict_fixup.c index 408d78f0b33..d836255926e 100644 --- a/src/lib/util/dict_fixup.c +++ b/src/lib/util/dict_fixup.c @@ -270,6 +270,8 @@ static fr_dict_attr_t const *dict_find_or_load_reference(fr_dict_t **dict_def, c return NULL; } + if (dict->proto->init && (dict->proto->init() < 0)) return -1; + /* * The reference is to the root of the foreign protocol, we're done. */ @@ -285,6 +287,14 @@ static fr_dict_attr_t const *dict_find_or_load_reference(fr_dict_t **dict_def, c * else, try to resolve the attribute. */ name += slen + 1; + + if (!*name) { + /* + * The reference is to the root of the foreign protocol, we're done. + */ + *dict_def = dict; + return dict->root; + } } /* diff --git a/src/lib/util/dict_util.c b/src/lib/util/dict_util.c index 76321326a99..ca7f3657777 100644 --- a/src/lib/util/dict_util.c +++ b/src/lib/util/dict_util.c @@ -3309,6 +3309,8 @@ static int dict_autoref_free(fr_dict_t *dict) } for (i = 0; i < talloc_array_length(refd_list); i++) { + if (refd_list[i]->proto->free) refd_list[i]->proto->free(); + if (fr_dict_free(&refd_list[i], dict->root->name) < 0) { fr_strerror_printf("failed freeing autoloaded protocol %s", refd_list[i]->root->name); return -1; diff --git a/src/protocols/dhcpv4/base.c b/src/protocols/dhcpv4/base.c index 589def994b5..90c8773fc03 100644 --- a/src/protocols/dhcpv4/base.c +++ b/src/protocols/dhcpv4/base.c @@ -733,6 +733,10 @@ fr_dict_protocol_t libfreeradius_dhcpv4_dict_protocol = { .subtype_table = subtype_table, .subtype_table_len = NUM_ELEMENTS(subtype_table), .attr_valid = attr_valid, + + .init = fr_dhcpv4_global_init, + .free = fr_dhcpv4_global_free, + .encode = fr_dhcpv4_encode_foreign, .decode = fr_dhcpv4_decode_foreign, }; diff --git a/src/protocols/dhcpv4/encode.c b/src/protocols/dhcpv4/encode.c index 279841346b0..faca5d70808 100644 --- a/src/protocols/dhcpv4/encode.c +++ b/src/protocols/dhcpv4/encode.c @@ -763,8 +763,6 @@ ssize_t fr_dhcpv4_encode_foreign(fr_dbuff_t *dbuff, fr_pair_list_t const *list) fr_dcursor_t cursor; fr_dbuff_t work_dbuff = FR_DBUFF(dbuff); - (void) fr_dhcpv4_global_init(); - fr_assert(dict_dhcpv4 != NULL); fr_pair_dcursor_iter_init(&cursor, list, fr_dhcpv4_next_encodable, dict_dhcpv4); diff --git a/src/protocols/radius/base.c b/src/protocols/radius/base.c index 7238489e215..0811da1f545 100644 --- a/src/protocols/radius/base.c +++ b/src/protocols/radius/base.c @@ -1319,6 +1319,10 @@ fr_dict_protocol_t libfreeradius_radius_dict_protocol = { .subtype_table = subtype_table, .subtype_table_len = NUM_ELEMENTS(subtype_table), .attr_valid = attr_valid, + + .init = fr_radius_init, + .free = fr_radius_free, + .decode = fr_radius_decode_foreign, .encode = fr_radius_encode_foreign, };