fr_dict_attr_t const *da;
size_t len;
fr_dict_attr_t const *ref;
+ char const *p;
char buffer[FR_DICT_ATTR_MAX_NAME_LEN + 1 + 1]; /* +1 \0 +1 for "too long" */
fr_sbuff_t our_name = FR_SBUFF(name);
fr_hash_table_t *namespace;
+
*out = NULL;
len = fr_sbuff_out_bstrncpy_allowed(&FR_SBUFF_OUT(buffer, sizeof(buffer)),
FR_SBUFF_ERROR_RETURN(&our_name);
}
+ /*
+ * Do a second pass, ensuring that the name has at least one alpha-numeric character.
+ */
+ for (p = buffer; p < (buffer + len); p++) {
+ if (sbuff_char_alpha_num[(uint8_t) *p]) break;
+ }
+
+ if ((size_t) (p - buffer) == len) {
+ fr_strerror_const("Invalid attribute name");
+ if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
+ FR_SBUFF_ERROR_RETURN(&our_name);
+ }
+
ref = fr_dict_attr_ref(parent);
if (ref) parent = ref;
{
char const *p = name, *end;
bool unknown = false;
+ bool alnum = false;
if (len < 0) len = strlen(name);
return -(p - name);
}
+
+ alnum |= sbuff_char_alpha_num[(uint8_t)*p];
+
p++;
}
+ if (!alnum) {
+ fr_strerror_const("Invalid attribute name");
+ return -1;
+ }
+
return len;
}
ssize_t fr_dict_valid_oid_str(char const *name, ssize_t len)
{
char const *p = name, *end;
+ bool alnum = false;
if (len < 0) len = strlen(name);
end = p + len;
return -(p - name);
}
+
+ alnum |= sbuff_char_alpha_num[(uint8_t)*p];
p++;
} while (p < end);
+ if (!alnum) return 0;
+
return len;
}