]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Same treatment for vendors...
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 16 Mar 2018 20:30:01 +0000 (20:30 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 16 Mar 2018 20:30:01 +0000 (20:30 +0000)
src/include/dict.h
src/lib/util/dict.c

index b0fc526e2a565d1478b6008bbec88d1dd8311bb9..c26e52999edb1eacbae59fd86abc13fd55354c6d 100644 (file)
@@ -122,7 +122,7 @@ typedef struct dict_vendor {
        size_t                  type;                           //!< Length of type data
        size_t                  length;                         //!< Length of length data
        size_t                  flags;                          //!< Vendor flags.
-       char                    name[1];                        //!< Vendor name.
+       char const              *name;                          //!< Vendor name.
 } fr_dict_vendor_t;
 
 /*
index 056c3b06657240581ed1c35b9c761b120c54125a..aaf796c4d4839548a9c476ad136b7e1ff9b81d34 100644 (file)
@@ -537,14 +537,19 @@ int fr_dict_vendor_add(fr_dict_t *dict, char const *name, unsigned int num)
                return -1;
        }
 
-       vendor = (fr_dict_vendor_t *)talloc_zero_array(dict->pool, uint8_t, sizeof(*vendor) + len);
-       if (vendor == NULL) {
-               fr_strerror_printf("%s: Out of memory", __FUNCTION__);
+#ifdef HAVE_TALLOC_POOLED_OBJECT
+       vendor = talloc_pooled_object(dict, fr_dict_vendor_t, 1, strlen(name) + 1);
+       memset(vendor, 0, sizeof(*vendor));
+#else
+       vendor = talloc_zero(dict, fr_dict_vendor_t);
+#endif
+
+       vendor->name = talloc_typed_strdup(vendor, name);
+       if (!vendor->name) {
+               talloc_free(vendor);
+               fr_strerror_printf("Out of memory");
                return -1;
        }
-       talloc_set_type(vendor, fr_dict_vendor_t);
-
-       strlcpy(vendor->name, name, len + 1);
        vendor->vendorpec = num;
        vendor->type = vendor->length = 1; /* defaults */
 
@@ -3802,19 +3807,15 @@ fr_dict_t *fr_dict_by_da(fr_dict_attr_t const *da)
  */
 int fr_dict_vendor_by_name(fr_dict_t const *dict, char const *name)
 {
-       fr_dict_vendor_t *dv;
-       size_t buffer[(sizeof(*dv) + FR_DICT_VENDOR_MAX_NAME_LEN + sizeof(size_t) - 1) / sizeof(size_t)];
+       fr_dict_vendor_t find = { .name = name }, *found;
 
        if (!name) return 0;
        INTERNAL_IF_NULL(dict);
 
-       dv = (fr_dict_vendor_t *)buffer;
-       strlcpy(dv->name, name, FR_DICT_VENDOR_MAX_NAME_LEN + 1);
-
-       dv = fr_hash_table_finddata(dict->vendors_by_name, dv);
-       if (!dv) return 0;
+       found = fr_hash_table_finddata(dict->vendors_by_name, &find);
+       if (!found) return 0;
 
-       return dv->vendorpec;
+       return found->vendorpec;
 }
 
 /** Look up a vendor by its PEN