From: Alan T. DeKok Date: Tue, 13 Jan 2026 21:31:36 +0000 (-0500) Subject: use value-box function to copy memory. CID #1680331 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f8a51b65dbf820a58579f0af06a0af8cac5dcbc;p=thirdparty%2Ffreeradius-server.git use value-box function to copy memory. CID #1680331 --- diff --git a/src/lib/util/stats.c b/src/lib/util/stats.c index 636df52aa7a..24afdd2b470 100644 --- a/src/lib/util/stats.c +++ b/src/lib/util/stats.c @@ -258,6 +258,7 @@ bool fr_stats_iter_next(fr_stats_iter_t *iter) int fr_stats_index_to_value_box(TALLOC_CTX *ctx, fr_value_box_t **out, fr_stats_instance_t const *inst, unsigned int index) { + size_t len; fr_value_box_t *box; uint8_t const *field; fr_dict_attr_t const *da; @@ -272,61 +273,43 @@ int fr_stats_index_to_value_box(TALLOC_CTX *ctx, fr_value_box_t **out, fr_stats_ field = ((uint8_t const *) inst->stats) + inst->def->entry[index].offset; -#undef COPY -#define COPY(_type, _field) \ - case _type: \ - memcpy(&box->vb_ ## _field, field, sizeof(box->vb_ ## _field)); \ - break - switch (box->type) { - case FR_TYPE_STRING: - if (!inst->def->entry[index].size) { - char const *str; - - memcpy(&str, field, sizeof(str)); - - if (fr_value_box_strdup(box, box, da, str, false) < 0) { - fail: - talloc_free(box); - return -1; - } - } else { - uint8_t const *end; - - /* - * Find the trailing NUL within the fixed-size field. - */ - end = memchr(field, '\0', inst->def->entry[index].size); - - if (fr_value_box_bstrndup(box, box, da, (char const *) field, - (size_t) (end - field), false) < 0) { - goto fail; - } - } - break; - - case FR_TYPE_OCTETS: - if (fr_value_box_memdup(box, box, da, field, - inst->def->entry[index].size, false) < 0) { - goto fail; - } - break; - - COPY(FR_TYPE_UINT16, uint16); - COPY(FR_TYPE_UINT32, uint32); - COPY(FR_TYPE_UINT64, uint64); - - COPY(FR_TYPE_IPV4_ADDR, ipv4addr); /* struct in_addr, and not vp_ip */ - COPY(FR_TYPE_IPV6_ADDR, ipv6addr); /* struct in6_addr, and not vp_ip */ - - COPY(FR_TYPE_DATE, date); - COPY(FR_TYPE_TIME_DELTA, time_delta); - + case FR_TYPE_STRING: + if (!inst->def->entry[index].size) { + char const *str; + + memcpy(&str, field, sizeof(str)); + len = strlen(str); + } else { + uint8_t const *end; + + /* + * Find the trailing NUL within the fixed-size field. + */ + end = memchr(field, '\0', inst->def->entry[index].size); + len = (size_t) (end - field); + } + break; + + case FR_TYPE_OCTETS: + case FR_TYPE_UINT16: + case FR_TYPE_UINT32: + case FR_TYPE_UINT64: + case FR_TYPE_IPV4_ADDR: + case FR_TYPE_IPV6_ADDR: + len = inst->def->entry[index].size; + break; + default: fr_strerror_printf("Unsupported data type '%s'", fr_type_to_str(box->type)); return -1; } + if (fr_value_box_from_memory(box, box, box->type, da, field, len) < 0) { + talloc_free(box); + return -1; + } + *out = box; return 0; }