* the first member.
*/
if ((dict_attr_sizes[sibling->type][1] == ~(size_t) 0) &&
- !((sibling->type == FR_TYPE_OCTETS) &&
- (sibling->flags.length > 0))) {
+ (sibling->flags.length == 0)) {
fr_strerror_printf("Only the last child of a 'struct' attribute can have variable length");
return false;
}
}
switch (da->type) {
- /*
- * If asked to encode more data than allowed, we
- * encode only the allowed data.
- */
- case FR_TYPE_STRING:
- if (flag_abinary(&da->flags)) {
- slen = fr_radius_encode_abinary(vp, fr_dbuff_current(&value_dbuff), fr_dbuff_remaining(&value_dbuff));
- if (slen <= 0) return slen;
-
- FR_DBUFF_ADVANCE_RETURN(&value_dbuff, (size_t) slen);
- break;
- }
- FALL_THROUGH;
-
- case FR_TYPE_OCTETS:
- FR_DBUFF_IN_MEMCPY_RETURN(&value_dbuff, (uint8_t const *)(vp->vp_ptr), len);
- break;
-
/*
* Common encoder might add scope byte
*/
FR_DBUFF_IN_MEMCPY_RETURN(&value_dbuff, (uint8_t const *)&vp->vp_ipv4addr, sizeof(vp->vp_ipv4addr));
break;
+ /*
+ * Special handling for "abinary". Otherwise, fall
+ * through to using the common encoder.
+ */
+ case FR_TYPE_STRING:
+ if (flag_abinary(&da->flags)) {
+ slen = fr_radius_encode_abinary(vp, fr_dbuff_current(&value_dbuff), fr_dbuff_remaining(&value_dbuff));
+ if (slen <= 0) return slen;
+
+ FR_DBUFF_ADVANCE_RETURN(&value_dbuff, (size_t) slen);
+ break;
+ }
+ FALL_THROUGH;
+
+ case FR_TYPE_OCTETS:
+
/*
* Simple data types use the common encoder.
*/
default:
slen = fr_value_box_to_network(&value_dbuff, &vp->data);
- if (slen < 0) return PAIR_ENCODE_FATAL_ERROR;
+ if (slen < 0) return slen;
break;
}