From: Alan T. DeKok Date: Wed, 7 Feb 2018 19:44:44 +0000 (-0500) Subject: return size of *output* data, not input data X-Git-Tag: release_3_0_17~70 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a6f15dbe31abbca21268cc9c680189d5d05425eb;p=thirdparty%2Ffreeradius-server.git return size of *output* data, not input data --- diff --git a/src/lib/value.c b/src/lib/value.c index 0420e884790..3d58883f591 100644 --- a/src/lib/value.c +++ b/src/lib/value.c @@ -972,7 +972,7 @@ finish: /** 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; @@ -980,7 +980,9 @@ static int value_data_hton(value_data_t *dst, PW_TYPE dst_type, void const *src, /* 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; @@ -989,21 +991,27 @@ static int value_data_hton(value_data_t *dst, PW_TYPE dst_type, void const *src, 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; @@ -1088,7 +1096,7 @@ static int value_data_hton(value_data_t *dst, PW_TYPE dst_type, void const *src, return -1; /* can't do it */ } - return 0; + return dst_len; } /** Convert one type of value_data_t to another @@ -1110,6 +1118,8 @@ ssize_t value_data_cast(TALLOC_CTX *ctx, value_data_t *dst, 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; /* @@ -1123,11 +1133,12 @@ ssize_t value_data_cast(TALLOC_CTX *ctx, value_data_t *dst, * 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; } /* @@ -1475,8 +1486,7 @@ ssize_t value_data_cast(TALLOC_CTX *ctx, value_data_t *dst, 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); } /*