From: Alan T. DeKok Date: Tue, 15 Nov 2016 20:44:19 +0000 (-0500) Subject: value_data_hton() should take value_data_t for src X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f43e81a960c83215c8a93190d2ddf79324f65656;p=thirdparty%2Ffreeradius-server.git value_data_hton() should take value_data_t for src --- diff --git a/src/include/libradius.h b/src/include/libradius.h index 55be98556d0..cb7288753b0 100644 --- a/src/include/libradius.h +++ b/src/include/libradius.h @@ -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, diff --git a/src/lib/value.c b/src/lib/value.c index c351f020512..d5168921a8a 100644 --- a/src/lib/value.c +++ b/src/lib/value.c @@ -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, ""), + fr_int2str(dict_attr_types, dst_type, ""), + 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; } diff --git a/src/modules/rlm_eap/lib/sim/sim_proto.c b/src/modules/rlm_eap/lib/sim/sim_proto.c index 63f37576248..f9a2f4ca7b4 100644 --- a/src/modules/rlm_eap/lib/sim/sim_proto.c +++ b/src/modules/rlm_eap/lib/sim/sim_proto.c @@ -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); }