]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix additional uses of subtype in the dns encoder and decoder
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 29 Oct 2024 11:22:32 +0000 (12:22 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 29 Oct 2024 11:40:22 +0000 (12:40 +0100)
src/protocols/dns/base.c
src/protocols/dns/decode.c
src/protocols/dns/dns.h
src/protocols/dns/encode.c

index 2e001e8fc86cdf7382c1d4b0eabd9da586e499dd..e8695b051da97b131601c6bb93906ae1577d2440 100644 (file)
@@ -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;
index 5924165e462c9c5ae2d3d7682a39b87da4974242..414fd452997c9ac10a80738eea0b13c2cf6229d5 100644 (file)
@@ -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) {
index 8225be8157e2f5e8eb984da73f4cd17b5d4701ac..ccd4976e6e62129e2296fc9db32c33ed27714112 100644 (file)
@@ -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];
index 8ae92b99f6870b91671a6a3bc0218d5df836cc35..3acb03c834f7aa463a8b65296c1ddcbf65728f9e 100644 (file)
@@ -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);