if it doesn't, then the input string contains a valid attribute,
but then ends with an invalid character, or with an unknown
attribute.
fr_dict_attr_by_oid_substr(err, &da, parent, &sbuff, NULL);
if (err != FR_DICT_ATTR_OK) return NULL;
+ /*
+ * If we didn't parse the entire string, then the parsing stopped at an unknown child.
+ * e.g. Vendor-Specific.Cisco.Foo. In that case, the full attribute wasn't found.
+ */
+ if (fr_sbuff_remaining(&sbuff) > 0) {
+ *err = FR_DICT_ATTR_NOTFOUND;
+ return NULL;
+ }
+
return da;
}