From: Arran Cudbard-Bell Date: Tue, 29 Oct 2024 11:22:32 +0000 (+0100) Subject: Fix additional uses of subtype in the dns encoder and decoder X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f2ee535d4cab379f8052a6ccb88f47a501b151f5;p=thirdparty%2Ffreeradius-server.git Fix additional uses of subtype in the dns encoder and decoder --- diff --git a/src/protocols/dns/base.c b/src/protocols/dns/base.c index 2e001e8fc86..e8695b051da 100644 --- a/src/protocols/dns/base.c +++ b/src/protocols/dns/base.c @@ -74,11 +74,11 @@ fr_dict_attr_autoload_t dns_dict_attr[] = { }; FR_DICT_ATTR_FLAG_FUNC(fr_dns_attr_flags_t, dns_label) -FR_DICT_ATTR_FLAG_FUNC(fr_dns_attr_flags_t, uncompressed) +FR_DICT_ATTR_FLAG_FUNC(fr_dns_attr_flags_t, dns_label_uncompressed) static fr_dict_flag_parser_t const dns_flags[] = { - { L("dns_label"), { .func = dict_flag_dns_label } }, - { L("uncompressed"), { .func = dict_flag_uncompressed } } + { L("dns_label"), { .func = dict_flag_dns_label } }, + { L("dns_label_uncompressed"), { .func = dict_flag_dns_label_uncompressed } } }; #define DECODE_FAIL(_reason) if (reason) *reason = FR_DNS_DECODE_FAIL_ ## _reason @@ -450,7 +450,7 @@ static bool attr_valid(fr_dict_attr_t *da) da->flags.is_known_width = true; } - if (fr_dns_flag_dns_label(da) || fr_dns_flag_uncompressed(da)) { + if (fr_dns_flag_dns_label_any(da)) { if (da->type != FR_TYPE_STRING) { fr_strerror_const("The 'dns_label' flag can only be used with attributes of type 'string'"); return false; diff --git a/src/protocols/dns/decode.c b/src/protocols/dns/decode.c index 5924165e462..414fd452997 100644 --- a/src/protocols/dns/decode.c +++ b/src/protocols/dns/decode.c @@ -53,7 +53,7 @@ static ssize_t decode_value_trampoline(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t const *parent, uint8_t const *data, size_t const data_len, void *decode_ctx) { - if ((parent->type == FR_TYPE_STRING) && !parent->flags.extra && parent->flags.subtype) { + if ((parent->type == FR_TYPE_STRING) && fr_dns_flag_dns_label(parent)) { fr_dns_ctx_t *packet_ctx = decode_ctx; return fr_pair_dns_labels_from_network(ctx, out, parent, packet_ctx->packet, data, data_len, packet_ctx->lb, false); @@ -211,7 +211,7 @@ static ssize_t decode_option(TALLOC_CTX *ctx, fr_pair_list_t *out, } FR_PROTO_TRACE("decode context changed %s -> %s",da->parent->name, da->name); - if ((da->type == FR_TYPE_STRING) && !da->flags.extra && da->flags.subtype) { + if ((da->type == FR_TYPE_STRING) && fr_dns_flag_dns_label(da)) { slen = fr_pair_dns_labels_from_network(ctx, out, da, packet_ctx->packet, data + 4, len, packet_ctx->lb, true); } else if (da->flags.array) { diff --git a/src/protocols/dns/dns.h b/src/protocols/dns/dns.h index 8225be8157e..ccd4976e6e6 100644 --- a/src/protocols/dns/dns.h +++ b/src/protocols/dns/dns.h @@ -133,7 +133,7 @@ typedef enum { typedef struct { bool dns_label; - bool uncompressed; + bool dns_label_uncompressed; } fr_dns_attr_flags_t; static inline fr_dns_attr_flags_t const *fr_dns_attr_flags(fr_dict_attr_t const *da) @@ -141,8 +141,15 @@ static inline fr_dns_attr_flags_t const *fr_dns_attr_flags(fr_dict_attr_t const return fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC); } +static inline bool fr_dns_flag_dns_label_any(fr_dict_attr_t const *da) +{ + fr_dns_attr_flags_t const *flags = fr_dns_attr_flags(da); + + return flags->dns_label || flags->dns_label_uncompressed; +} + #define fr_dns_flag_dns_label(_da) (fr_dns_attr_flags(_da)->dns_label) -#define fr_dns_flag_uncompressed(_da) (fr_dns_attr_flags(_da)->uncompressed) +#define fr_dns_flag_dns_label_uncompressed(_da) (fr_dns_attr_flags(_da)->dns_label_uncompressed) extern fr_table_num_ordered_t fr_dns_reason_fail_table[]; extern char const *fr_dns_packet_names[FR_DNS_CODE_MAX]; diff --git a/src/protocols/dns/encode.c b/src/protocols/dns/encode.c index 8ae92b99f68..3acb03c834f 100644 --- a/src/protocols/dns/encode.c +++ b/src/protocols/dns/encode.c @@ -149,12 +149,9 @@ static ssize_t encode_value(fr_dbuff_t *dbuff, /* * DNS labels get a special encoder. */ - if (!da->flags.extra) { + if (fr_dns_flag_dns_label_any(da)) { fr_dbuff_marker_t last_byte, src; - fr_assert(fr_dns_flag_dns_label(da) || - fr_dns_flag_uncompressed(da)); - fr_dbuff_marker(&last_byte, &work_dbuff); fr_dbuff_marker(&src, &work_dbuff); FR_PROTO_TRACE("encode DNS label %s", vp->vp_strvalue);