From: Alan T. DeKok Date: Fri, 20 Jan 2017 17:12:14 +0000 (-0500) Subject: fix fr_dict_unknown_add(). Addresses #1883 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=179a01b4e0ea457e391cec09af828211bb587d1c;p=thirdparty%2Ffreeradius-server.git fix fr_dict_unknown_add(). Addresses #1883 When an admin uses Attr-26 in the config files, this function needs to add Attr-26, and then return the newly-defined Attr-26, and NOT return Vendor-Specific --- diff --git a/src/lib/dict.c b/src/lib/dict.c index 1be204bad60..689c4d8a729 100644 --- a/src/lib/dict.c +++ b/src/lib/dict.c @@ -2766,6 +2766,9 @@ fr_dict_attr_t const *fr_dict_unknown_add(fr_dict_t *dict, fr_dict_attr_t const if (!old) return NULL; + da = fr_dict_attr_by_name(dict, old->name); + if (da) return da; + /* * Define the complete unknown hierarchy */ @@ -2775,9 +2778,6 @@ fr_dict_attr_t const *fr_dict_unknown_add(fr_dict_t *dict, fr_dict_attr_t const parent = old->parent; } - da = fr_dict_attr_child_by_num(parent, old->attr); - if (da) return da; - memcpy(&flags, &old->flags, sizeof(flags)); flags.is_unknown = false; @@ -2787,10 +2787,13 @@ fr_dict_attr_t const *fr_dict_unknown_add(fr_dict_t *dict, fr_dict_attr_t const */ if (old->type == PW_TYPE_VENDOR) if (fr_dict_vendor_add(dict, old->name, old->attr) < 0) return NULL; - if (fr_dict_attr_add(dict, old->parent, old->name, old->attr, old->type, flags) < 0) return NULL; - - da = fr_dict_attr_child_by_num(parent, old->attr); - return da; + /* + * Add the unknown by NAME. e.g. if the admin does "Attr-26", we want + * to return "Attr-26", and NOT "Vendor-Specific". The rest of the server + * is responsible for converting "Attr-26 = 0x..." to an actual attribute, + * if it so desires. + */ + return fr_dict_attr_add_by_name(dict, old->parent, old->name, old->attr, old->type, flags); } /** Free dynamically allocated (unknown attributes)