/** Performs byte order reversal for types that need it
*
*/
-static int value_data_hton(value_data_t *dst, PW_TYPE dst_type, void const *src, size_t src_len)
+static ssize_t value_data_hton(value_data_t *dst, PW_TYPE dst_type, void const *src, size_t src_len)
{
size_t dst_len;
uint8_t *dst_ptr;
/* 8 byte integers */
switch (dst_type) {
case PW_TYPE_INTEGER64:
- if (src_len < sizeof(dst->integer64)) return -1;
+ dst_len = sizeof(dst->integer64);
+
+ if (src_len < dst_len) return -1;
dst->integer64 = htonll(*(uint64_t const *)src);
break;
case PW_TYPE_INTEGER:
case PW_TYPE_DATE:
case PW_TYPE_SIGNED:
- if (src_len < sizeof(dst->integer)) return -1;
+ dst_len = sizeof(dst->integer);
+
+ if (src_len < dst_len) return -1;
dst->integer = htonl(*(uint32_t const *)src);
break;
/* 2 byte integers */
case PW_TYPE_SHORT:
- if (src_len < sizeof(dst->ushort)) return -1;
+ dst_len = sizeof(dst->ushort);
+
+ if (src_len < dst_len) return -1;
dst->ushort = htons(*(uint16_t const *)src);
break;
/* 1 byte integer */
case PW_TYPE_BYTE:
- if (src_len < sizeof(dst->byte)) return -1;
+ dst_len = sizeof(dst->byte);
+
+ if (src_len < dst_len) return -1;
dst->byte = *(uint8_t const *)src;
break;
return -1; /* can't do it */
}
- return 0;
+ return dst_len;
}
/** Convert one type of value_data_t to another
PW_TYPE src_type, DICT_ATTR const *src_enumv,
value_data_t const *src, size_t src_len)
{
+ ssize_t dst_len;
+
if (!fr_assert(dst_type != src_type)) return -1;
/*
* Converts the src data to octets with no processing.
*/
if (dst_type == PW_TYPE_OCTETS) {
- if (value_data_hton(dst, src_type, src, src_len) < 0) return -1;
+ dst_len = value_data_hton(dst, src_type, src, src_len);
+ if (dst_len < 0) return -1;
- dst->octets = talloc_memdup(ctx, dst, src_len);
+ dst->octets = talloc_memdup(ctx, dst, dst_len);
talloc_set_type(dst->octets, uint8_t);
- return talloc_array_length(dst->strvalue);
+ return dst_len;
}
/*
if (src_type == PW_TYPE_OCTETS) {
do_octets:
- if (value_data_hton(dst, dst_type, src->octets, src_len) < 0) return -1;
- return src_len;
+ return value_data_hton(dst, dst_type, src->octets, src_len);
}
/*