]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add and use fr_dict_coerce()
authorAlan T. DeKok <aland@freeradius.org>
Tue, 5 Nov 2019 16:57:55 +0000 (11:57 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 5 Nov 2019 16:58:19 +0000 (11:58 -0500)
to allow adding attributes to dicts at run time

src/bin/radclient.c
src/bin/radsniff.c
src/bin/radsnmp.c
src/lib/util/dict.h
src/lib/util/dict_util.c
src/modules/proto_dhcpv4/dhcpclient.c
src/modules/rlm_isc_dhcp/rlm_isc_dhcp.c
src/modules/rlm_ldap/rlm_ldap.c
src/modules/rlm_sqlcounter/rlm_sqlcounter.c

index 0d7e0e7a85bcae48e807f87ecd9f1900cab354ce..903dbeda965dbd4b7be1401527d144dbf48552f3 100644 (file)
@@ -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;
        }
index 6008eec31aa8eaa37926790b67310915b36f8977..fd3bf25b27bc668fc25e928ae7100df6daad63d4 100644 (file)
@@ -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;
index 7883056ea497114ffd87afa91596dba36b88d830..26759c9249d783099f36075ebd2eff21a4399e6d 100644 (file)
@@ -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);
        }
index 02716ed05dc4a232df38bdd4e2ff974dc2efd523..5d249867e0e4e1d5716abd7086e0ebdc72e82f8a 100644 (file)
@@ -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
index a7fe0854fa608bd18fc142a40653e87a4cecdf4f..aef61f35eda8b534fb8b837b587a91cd52e14fd5 100644 (file)
@@ -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;
+}
index d39713a0c0647650b5ffecdaa310526b8ec6f811..fb8936c890e23337ea984b86f6a21c3233032f96 100644 (file)
@@ -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);
        }
index c39b287847b7cece1e31491dc925951ddcefd8a3..13155ad1378433f5cf24057df90dbade6c014584 100644 (file)
@@ -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;
 
index 0afe8dc0d6ffe328fa5f7e2a8a9613397bff0253..53ff574af2ee26b3b1b0e598176b5e4f394e90a7 100644 (file)
@@ -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:
index 9660321da9f9d6be442c8c5788ff779d3ac39e4f..eba7fa37807dd07ffbdb2fd63ad09bfc93230d67 100644 (file)
@@ -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;
        }