]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
return size of *output* data, not input data
authorAlan T. DeKok <aland@freeradius.org>
Wed, 7 Feb 2018 19:44:44 +0000 (14:44 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 7 Feb 2018 19:44:44 +0000 (14:44 -0500)
src/lib/value.c

index 0420e884790f1917aad78d4cb780882febf69c3a..3d58883f591ef8cee2dc448bb1d6ecdd78d27998 100644 (file)
@@ -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);
        }
 
        /*