#define DICT_VALUE_MAX_NAME_LEN (128)
#define DICT_VENDOR_MAX_NAME_LEN (128)
+#define DICT_ATTR_MAX_NAME_LEN (128)
static fr_hash_table_t *vendors_byname = NULL;
static fr_hash_table_t *vendors_byvalue = NULL;
static dict_stat_t *stat_tail = NULL;
typedef struct value_fixup_t {
- char attrstr[40];
+ char attrstr[DICT_ATTR_MAX_NAME_LEN];
DICT_VALUE *dval;
struct value_fixup_t *next;
} value_fixup_t;
int dict_addattr(const char *name, int vendor, int type, int value,
ATTR_FLAGS flags)
{
+ size_t namelen;
static int max_attr = 0;
DICT_ATTR *attr;
- if (strlen(name) > (sizeof(attr->name) -1)) {
+ namelen = strlen(name);
+ if (namelen >= DICT_ATTR_MAX_NAME_LEN) {
librad_log("dict_addattr: attribute name too long");
return -1;
}
/*
* Create a new attribute for the list
*/
- if ((attr = fr_pool_alloc(sizeof(*attr))) == NULL) {
+ if ((attr = fr_pool_alloc(sizeof(*attr) + namelen)) == NULL) {
librad_log("dict_addattr: out of memory");
return -1;
}
- strcpy(attr->name, name);
+ memcpy(attr->name, name, namelen);
+ attr->name[namelen] = '\0';
attr->attr = value;
attr->attr |= (vendor << 16); /* FIXME: hack */
attr->vendor = vendor;
*/
DICT_ATTR *dict_attrbyname(const char *name)
{
- DICT_ATTR dattr;
+ DICT_ATTR *da;
+ uint32_t buffer[(sizeof(*da) + DICT_ATTR_MAX_NAME_LEN + 3)/4];
if (!name) return NULL;
- strlcpy(dattr.name, name, sizeof(dattr.name));
+ da = (DICT_ATTR *) buffer;
+ strlcpy(da->name, name, DICT_ATTR_MAX_NAME_LEN + 1);
- return fr_hash_table_finddata(attributes_byname, &dattr);
+ return fr_hash_table_finddata(attributes_byname, da);
}
/*
dv = fr_hash_table_finddata(values_byname, my_dv);
if (dv) my_dv->attr = dv->value;
- strlcpy(my_dv->name, name, DICT_VALUE_MAX_NAME_LEN);
+ strlcpy(my_dv->name, name, DICT_VALUE_MAX_NAME_LEN + 1);
return fr_hash_table_finddata(values_byname, my_dv);
}
if (!name) return 0;
dv = (DICT_VENDOR *) buffer;
- strlcpy(dv->name, name, DICT_VENDOR_MAX_NAME_LEN);
+ strlcpy(dv->name, name, DICT_VENDOR_MAX_NAME_LEN + 1);
dv = fr_hash_table_finddata(vendors_byname, dv);
if (!dv) return 0;