]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
value_data_hton() should take value_data_t for src
authorAlan T. DeKok <aland@freeradius.org>
Tue, 15 Nov 2016 20:44:19 +0000 (15:44 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 15 Nov 2016 20:44:19 +0000 (15:44 -0500)
src/include/libradius.h
src/lib/value.c
src/modules/rlm_eap/lib/sim/sim_proto.c

index 55be98556d074a5d247db558dea3b4ea139ae265..cb7288753b0651d73d50c6b8dd02e669425b98ec 100644 (file)
@@ -328,7 +328,7 @@ int         value_data_from_str(TALLOC_CTX *ctx, value_data_t *dst,
                                    PW_TYPE *src_type, fr_dict_attr_t const *src_enumv,
                                    char const *src, ssize_t src_len, char quote);
 
-void           value_data_hton(value_data_t *dst, PW_TYPE type, void const *src, size_t src_len);
+void           value_data_hton(value_data_t *dst, PW_TYPE type, value_data_t const *src);
 
 int            value_data_cast(TALLOC_CTX *ctx, value_data_t *dst,
                                PW_TYPE dst_type, fr_dict_attr_t const *dst_enumv,
index c351f02051202997773764cd0b1c2e1218ccb284..d5168921a8a1d7223f15ab2f3f5ca4a21d36b91c 100644 (file)
@@ -1174,7 +1174,7 @@ finish:
 /** Performs byte order reversal for types that need it
  *
  */
-void value_data_hton(value_data_t *dst, PW_TYPE type, void const *src, size_t src_len)
+void value_data_hton(value_data_t *dst, PW_TYPE type, value_data_t const *src)
 {
        /* 8 byte integers */
        switch (type) {
@@ -1200,7 +1200,7 @@ void value_data_hton(value_data_t *dst, PW_TYPE type, void const *src, size_t sr
                return;         /* shouldn't happen */
 
        default:
-               memcpy(&dst->datum, src, src_len);
+               value_data_copy(NULL, dst, type, src);
                break;
        }
 }
@@ -1241,7 +1241,7 @@ int 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) {
-               value_data_hton(dst, src_type, &src->datum, src->length);
+               value_data_hton(dst, src_type, src);
                dst->octets = talloc_memdup(ctx, &dst->datum, src->length);
                dst->length = src->length;
                talloc_set_type(dst->octets, uint8_t);
@@ -1635,9 +1635,22 @@ int value_data_cast(TALLOC_CTX *ctx, value_data_t *dst,
        }
 
        if (src_type == PW_TYPE_OCTETS) {
+               value_data_t tmp;
+
        do_octets:
-               value_data_hton(dst, dst_type, src->octets, src->length);
-               dst->length = src->length;
+               if (src->length < value_data_field_sizes[dst_type]) {
+                       fr_strerror_printf("Invalid cast from %s to %s.  Source is length %zd is smaller than destination type size %zd",
+                                          fr_int2str(dict_attr_types, src_type, "<INVALID>"),
+                                          fr_int2str(dict_attr_types, dst_type, "<INVALID>"),
+                                          src->length,
+                                          value_data_field_sizes[dst_type]);
+                       return -1;
+               }
+
+               memcpy(&tmp.datum, src->octets, value_data_field_sizes[dst_type]);
+
+               value_data_hton(dst, dst_type, &tmp);
+               dst->length = value_data_field_sizes[dst_type];
                return 0;
        }
 
index 63f375762481fa75a5a6c36309628f4207eba683..f9a2f4ca7b4622a3bd0a81bb8b4a1605d650ee75 100644 (file)
@@ -938,7 +938,7 @@ ssize_t fr_sim_encode(REQUEST *request, fr_dict_attr_t const *parent, uint8_t ty
                {
                        value_data_t data;
 
-                       value_data_hton(&data, vp->da->type, &vp->data.datum, vp->vp_length);
+                       value_data_hton(&data, vp->da->type, &vp->data);
                        memcpy(&p[2], &data, vp->vp_length);
                }